Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564

Handle of Window in wndProc

28.04.2016, 15:39. Показов 1441. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть несколько окон, создавались они одним классом, и привязанны к одному обработчику wndproc. Нужно выудить какое из окон присылает команду, например в WM_CREATE.

Изначально делал окна с стилем CHILD и указывал родителем - основное окно приложения, флаг HMENU заполнял статическим числом для каждого окна. Однако задача немного изменилась, и CHILD флаг пришлось убрать, в месте с ним и hwndparent теперь NULL, и вылезла ошибка 1401 (пришлось и HMENU убрать).

Раньше работало так:
C++
1
2
3
4
5
6
7
8
9
10
case WM_CREATE:
    if(GetDlgCtrlID(hDlg) == gWId[0])
    {
    //... обработка 0-окна
    }
    else if(GetDlgCtrlID(hDlg) == gWId[1])
    {
    //... обработка 1-окна
    }
break;
Но теперь нету HMENU (т.е. идентификатора), а глобальные hWin[0] (которые я указывал при CreateWindow) не соответствуют hDlg.. т.е. вот так не работает, хотя поидее должно:
C++
1
if(hDlg == gWin[0])
Почему и как исправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.04.2016, 15:39
Ответы с готовыми решениями:

Ошибка в window.captureEvents(Event.CLICK); window.onClick= handle; function handle(e) { alert(''); return false; }
<script> window.captureEvents(Event.CLICK); window.onClick= handle; function handle(e) { alert(''); return false; } ...

Как бороться с ошибкой Creating window handle errors in a c sharp application
Как бороться с ошибкой Creating window handle errors in a c sharp application

Ошибка Exception EOSError in module .... System error. Code: 1400. Invalid window handle.
Доброе время суток! Я использовал поток в приложении CreateThread().. Примерно такая струкура приложения получилась: interface uses ...

9
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
28.04.2016, 17:53
Т.е. в WinProc вам нужно определить что это за окно? Почему просто при создании окна не сохранять хендлы в массив?

Добавлено через 17 минут
Т.е. получается делаем массив структур. В структуре два поля, одно поле это хэндл окна (полученный от CreateWindow), другое id по которому окно определяется из WndProc. Как то так.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.04.2016, 18:03  [ТС]
Цитата Сообщение от jupman Посмотреть сообщение
при создании окна не сохранять хендлы в массив?
Они сохранены, gWin[0] это 0 элемент этого HWND массива.

Только что тестировал.. Перед вызовом WM_CREATE в функцию попадает ещё 7 сообщений, установка пера, и т.п.. И в момент когда приходит WM_CREATE - его хэндл оказывается равен NULL. (и лишь после обработки WM_CREATE глобальный хэндл принимает значение, т.е. завершается работа функции CreateWindow, кто бы знал что вот так вот это происходит)
В общем то пока что единственный выход который я пока что нашёл - кривой, получать GetWindowText, и через него уже выводить сам HWND)

В общем получилось то что лишь после обработки WM_CREATE, hDlg (переменная самой wndproc) уже примет правильное значение, ровно как и сам глобальный хэндл.
Косяк майкрософтов лишь в том, что в winuser.h они определили номера WM_#### не в том порядке, в котором идёт обработка, т.е. если бы номера предустановки кисти, фона и т.д. были бы меньше чем WM_CREATE, то можно было бы просто обычным номером решить вопрос, но.. мде.

Добавлено через 1 минуту
Цитата Сообщение от jupman Посмотреть сообщение
другое id по которому окно определяется из WndProc
Было так, пока окно было WM_CHILD, как только флаг я убрал, сразу вылезла ошибка и HMENU параметр пришлось так же поставить в NULL.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
28.04.2016, 18:17
Цитата Сообщение от Izual Посмотреть сообщение
И в момент когда приходит WM_CREATE - его хэндл оказывается равен NULL.
А может тогда через последний параметр CreateWindow WM_CREATE информировать.

lpParam [in, optional]

Type: LPVOID

A pointer to a value to be passed to the window through the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
28.04.2016, 18:44
Используйте сообщение WM_NCCREATE
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.04.2016, 19:17  [ТС]
Operok, а толку то? Оно вообще раньше чем WM_CREATE приходит, и точно так же хэндл там НУЛЛ.

Цитата Сообщение от jupman Посмотреть сообщение
через последний параметр CreateWindow WM_CREATE информировать
Как вариант, но.. Это пятая нога.. Точно с таким же макаром я могу создать глобальную переменную, и через неё делать тоже самое.

В общем косяк.. Нарушение порядка... Надо было им сделать чтоб в NCCREATE - уже назначался hande. Вот он матерриальный мир... создатели не предусмотрели, что перед действием должна быть мысль, которая уже зарождает объект. Ну это так, филосовский отступ)
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
28.04.2016, 19:40
Цитата Сообщение от Izual Посмотреть сообщение
Оно вообще раньше чем WM_CREATE приходит, и точно так же хэндл там НУЛЛ.
Параметр оконной процедуры HWND - нулл? Может вы хотите использовать результат возвращаемый функцией CreateWindow в обработчике WM_CREATE(NCCREATE), так ничего не получится, функция вернёт вым хендл не раньше чем будет обработано сообщение WM_CREATE.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
28.04.2016, 20:03  [ТС]
Цитата Сообщение от Operok Посмотреть сообщение
результат возвращаемый функцией CreateWindow в обработчике WM_CREATE(NCCREATE), так ничего не получится
Хотел, по типу как я делал с аргументом HMENU ID:
C++
1
if(GetDlgCtrlID(hDlg) == gWId[0])
Ну так то понятно, если бы я передавал gWin[0] через ссылку в виде аргумента, то это может и можно было бы реализовать (майкрософтами), но так как сделано по другому - то вполне логично теперь, что эта переменная безполезна пока ф. CreateWindow не отработает.
Цитата Сообщение от Operok Посмотреть сообщение
функция вернёт вым хендл не раньше чем будет обработано сообщение WM_CREATE
Ну да, не знал что CreateWindow уже посылает сообщения..

Цитата Сообщение от Operok Посмотреть сообщение
Параметр оконной процедуры HWND - нулл?
Наверно нет, это я не смотрел, смотрел другое.. Видимо ошибся мальца когда писал выше. Вот кстати интересно а что же там.. Ведь по факту хэндла у окна ещё нету..

Вот интересно, а они в новых версиях винды исправляли такие недостатки? Айди значит не назначиш, WM_AFTERCREATE нету.. Недавно вот нашёл баг, что в одном цикле обработки нельзя ShowWindow много раз к одному окну использовать... Видать там таких багов полно, хоть пиши новые функции для всего этого..

Добавлено через 6 минут
Вот кстати возник вопрос, а есть ли что то ещё глубже чем WinApi? Т.е. то на чём оно построено, чтоб напрямую туда капнуть..
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
28.04.2016, 20:22
Izual, до сообщения WM_CREATE еще нет handle окна!
Я бы посоветовал сделать по-другому:
1) В WM_CREATE ничего не делаем
2) Получить и сохранить handle окна в массиве после выхода из функции создания окна
3) После создания всех окон, но до показа и обработки очереди сделать всю работу для всех окон (handle всех окон у нас есть) в момент создания.
4) При обработке сообщений ищем окно в массиве handle
1
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
29.04.2016, 09:46  [ТС]
Цитата Сообщение от _liv_ Посмотреть сообщение
3) После создания всех окон, но до показа и обработки очереди сделать всю работу для всех окон (handle всех окон у нас есть) в момент создания.
Ну да, как вариант создать свой WM_AFTERCREATE с помощью напильника..

...

Так и сделал.. Не то чего я хотел, но зато работает. Жаль что нельзя глубже капнуть, в саму очередь сообщений.

Может кто подскажет, в QT тоже так же криво всё? (ну QT под windows понятное дело, что тот же самый WinAPI, но именно под линукс может всё чуть логичнее сделано?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.04.2016, 09:46
Помогаю со студенческими работами здесь

"Error creating window handle" и ADO.NET
У меня есть WinForms application на .NET 4. Пользователи жаловались - несколько раз выскакивала ошибка "Error creating window...

WndProc&WndProc
В чем разница между функциями WndProc и WindowProc? Какая из них для API??

Как выбрать окно, если его handle не совпадает с handle процесса?
Добрый день! Задача на первый взгляд довольно простая: выбрать окно программы, переместить его в определённую часть экрана и нажать на...

Что означает выражение HANDLE hWritePipe = (HANDLE)atoi(argv[1]);
К тому же у меня нет 1-го. только нулевой

Application.Handle выдает identifier idents no member "Handle", на Дельфи всё работает
Не компилируется к примеру код: begin MessageDlg('Уже поздно. Будь послушным мальчиком. '+ 'Туши свет и вали спать!',...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru