Хэндл и идентификатор диалогового окна
1) можно ли, зная ID диалогового окна получить его хэндл?
2) можно ли, зная хэндл диалогового окна получить его ID?
Понятно, что возможны ситуации, когда диалоговое окно еще/уже не существует.
Вот разбирайся.
GetDlgItem - получает hwnd по ID.
Подробнее в msdn посмотри :-))))
GetDlgItem - получает hwnd по ID.
Подробнее в msdn посмотри :-))))[/QUOTE]
К сожалению эти функции работают только для контролов, а не для самого диалогового окна.
В частности GetDlgCtrlID(hDlg) возвращает 0 (function fails),
а для GetDlgItem одним из параметров является hDlg, т.е. то, что мне в данном случае хотелось бы получить.
например WindowFromPoint - из указанной точки на экране получает окно, в которое эта точка попадает(можно использовать вместе с GetCursorPos - мышью выбираешь окно.)
это чето стремный способ, лучше уж тогда по заголовку - FindWindow.
например WindowFromPoint - из указанной точки на экране получает окно, в которое эта точка попадает(можно использовать вместе с GetCursorPos - мышью выбираешь окно.)[/QUOTE]
У меня следующая проблема. Главное окно приложения — диалоговое модальное. В нем разные кнопки, при нажатии на которые открываются другие диалоговые окна, и т.д. Так как я сделал главное окно приложения диалоговым, то вместе со всеми плюсами, которые дал менеджер диалогового окна (dialog box manager), я получил и минусы (например, невозможность отловить нажатие на Esc и Enter, проблема с акселераторами, и т.д.).
Поэтому я поставил хук WH_GETMESSAGE на свой поток и могу обрабатывать все интересующие сообщения (спасибо ШпиЁну). Так вот, в фильтрующей функции этого хука я могу узнать хэндл окна, которому предназначается сообщение. В этой функции мне нужно знать хэндлы своих диалоговых окон, чтобы для одних окон (или их контролов) обрабатывать одни сообщения, а для других — другие.
Можно ли решить эту проблему без использования глобальных переменных?
А чем не устраивают немодальные диалоги(CreateDialogParam)?
я не знаю почему ты не хочешь использовать глобальные переменные:)))) удобно. просто.
[/QUOTE]
Нет нельзя, т.к. на основе шаблона, определенного в ресурсах с соответствующим ID, можно создать несколько диалоговых окон.
[QUOTE=Sir]2) можно ли, зная хэндл диалогового окна получить его ID?[/QUOTE]
GetWindowLong (hWnd, GWL_ID). Но в силу преведенного выше довода практическая польза с такой операции минимальна.
[QUOTE=k3Eahn]А чем не устраивают немодальные диалоги(CreateDialogParam)?[/QUOTE]
Да вобщем-то всем устраивают. Просто не хочется немодальным диалогом иммитировать поведение модального. Кроме того хэндл, возвращаемый CreateDialog, все-равно нужно делать глобальным, чтобы он был виден в фильтрующей функции хука. Неговоря уже о ситуации, когда в одном немодальном диалоговом окне создается другое, а в нем следующее и т.д.
[QUOTE=ШпиЁн]я не знаю почему ты не хочешь использовать глобальные переменные))) удобно. просто.[/QUOTE]
Я не сторонник вводить дополнительные глобальные переменные, если можно обойтись без них (принцип инкапсуляции ООП) :)
Но похоже эту проблему по-другому не решить. Придется заводить глобальные переменные для каждого диалогового окна.
Всем спасибо. Тема закрыта.
[/QUOTE]
Можно и без глобальных !!!
Сразу после создания любого окна нужно его пометить:
DWORD dw = 1;
SetWindowLong (hWnd, GWL_USERDATA, dw);
Далее в перехватчике:
switch (GetWindowLong (hWnd, GWL_USERDATA))
{
case 1:
...
break;
case 2:
...
break;
...
}
А метод CWinApp::PreTranslateMessage пробовал?
Это не MFC, а чистый WinAPI
:)