#c #winapi
Вопрос:
Есть ли способ получить обработчик HWND моего окна?
Я использую win32.
Комментарии:
1. да… Но моему классу это нужно. Я знаю, как это сделать, продолжая передавать его как переменную, но я хочу, чтобы что-то вроде функции получало его для меня вместо передачи
2. Обработчик HWND… вы имеете в виду процедуру окна?
3. Тот, который я получаю от CreateWindow().
4. эм…
CreateWindow()
возвращает HWND. чем я где-то храню это, чем передаю своему классу. вот как я это делаю. Я просто спрашиваю, есть ли у win32 функция, которая передает HWND моего окна, не создавая окно5. @Ramilol: Я не знаю, почему люди пристают к тебе по этому поводу. Это совершенно правильный вопрос, который сформулирован достаточно четко, учитывая, что английский, очевидно, не является вашим основным языком. Это правда, что использование GetActiveWindow (), вероятно, не лучший способ сделать это, но есть способ сделать то, что вы пытаетесь сделать .
Ответ №1:
Вы можете вызвать GetActiveWindow, чтобы получить активный элемент управления в своем приложении, а затем повторно вызвать getParent для возвращаемого дескриптора, пока он не вернет значение NULL. Последним допустимым дескриптором, который вы получите, должен быть дескриптор вашего главного окна.
Более простой способ, как сказал кто-то другой, — это где-то сохранить возвращенное значение из CreateWindow.
Комментарии:
1. 1 за фактический ответ на вопрос. Имейте в виду, что существует множество сценариев, в которых это будет работать не так, как вы ожидаете или как вы хотите. Лучше всего не полагаться на GetActiveWindow, если это вообще возможно, если только вам действительно не нужно активное окно.
Ответ №2:
Вероятно, полезно понять, почему нет простого способа. Все сводится к вопросу «какое окно?». Скорее всего, прямо сейчас на вашем экране будет видно несколько окон. Например, панель задач в нижней части экрана представляет собой окно. даже в вашем собственном приложении обычно их несколько. Например, диалоговое окно «Сохранить файл» представляет собой окно. Даже самое простое MessageBox
-это окно.
Итак, как вы определяете, о каком окне вы говорите? Распространенный ответ заключается в том, что вы идентифицируете их по своим HWND
. Итак, чтобы получить позицию диалогового окна «Сохранить файл», вы запрашиваете позицию, связанную с этим HWND. Очевидно, что таким образом вы можете получить любую собственность, кроме самой HWND
себя ! Имеет смысл спросить позицию X/Y HWND(0x5e21)
, но глупо спрашивать, какая HWND
из них принадлежит HWND(0x5e21)
.
Теперь может случиться так, что у вас есть еще одно более или менее уникальное свойство, и вы хотите извлечь HWND
из этого выгоду. Например, у вас может быть позиция X/Y. В этом случае WindowFromPoint(xy)
вернет HWND
его на эту позицию.
Но наиболее распространенным случаем является то, что вам нужно отреагировать на сообщение Windows для вашего окна. В этом случае вы получаете HWND
свое окно в качестве первого аргумента WindowProc()
.
Поэтому, если вы не сообщите нам, какой уникальной информацией вы обладаете, мы не сможем рассказать вам, как найти совпадение HWND
.
Ответ №3:
Разве вы не создали свое окно с помощью CreateWindow()
или CreateWindowEx()
? Функция CreateWindowEx() и функция CreateWindow() возвращают значение HWND
только что созданного окна.
Кроме того, операционная система передает вам HWND
ваше окно(окна) с помощью вашей оконной процедуры. Это не функция, которую вы вызываете; это функция, которую вызывает операционная система, чтобы позволить вашему приложению выполнять любую необходимую обработку.