Получение HWND текущего процесса - PullRequest
16 голосов
/ 12 апреля 2010

У меня есть процесс в C ++, в котором я использую оконный API. Я хочу получить HWND собственного процесса. Пожалуйста, наведите меня, как я могу сделать это возможным.

Ответы [ 7 ]

17 голосов
/ 12 апреля 2010

Если вы говорите о получении дескриптора процесса , то это не HWND (то есть w i nd ow h andle), но a HANDLE (т. е. дескриптор объекта ядра); чтобы получить псевдо-дескриптор относительно текущего процесса, вы можете использовать GetCurrentProcess, как объяснили другие.

С другой стороны, если вы хотите получить HWND (дескриптор окна ) к главному окну вашего приложения, то вам нужно пройтись по существующим окнам с EnumWindows и проверить их право собственности с помощью GetWindowThreadProcessId, сравнивая возвращенный идентификатор процесса с идентификатором, возвращенным GetCurrentProcessId. Тем не менее, в этом случае вам лучше сохранять дескриптор главного окна в переменной при создании, а не делать весь этот беспорядок.

Во всяком случае, всегда помните, что не все дескрипторы одинаковы: HANDLE s и HWND s, в частности, совершенно разные звери: первые - это дескрипторы ядра (= дескрипторы объектов, управляемых ядром) и управляются с помощью общих функций манипулирования дескрипторами ядра (DuplicateHandle, CloseHandle, ...), в то время как вторые являются дескрипторами относительно оконного менеджера, который является совершенно другой частью ОС, и управляются с помощью другой набор функций.

На самом деле, теоретически HWND может иметь то же "числовое" значение, что и HANDLE, но они будут относиться к совершенно другим объектам.

14 голосов
/ 12 апреля 2010

Вы (неправильно) предполагаете, что процесс имеет только один HWND. Обычно это не так, и поэтому Windows не может предложить API для его получения. Программа может создать два окна и в результате иметь два HWND. OTOH, если ваша программа создает только одно окно, она может сохранить этот HWND в глобальной переменной.

6 голосов
/ 14 февраля 2015

Получите ваше окно консоли

GetConsoleWindow();


"Возвращаемое значение является дескриптором окна, используемого консолью, связанной с вызывающим процессом, или NULL, если такой связанной консоли нет."

https://msdn.microsoft.com/en-us/library/windows/desktop/ms683175(v=vs.85).aspx

Получить другие окна

GetActiveWindow() может НЕ быть ответом, но это может быть полезно
"Возвращаемое значение - это дескриптор активного окна, присоединенного к очереди сообщений вызывающего потока. В противном случае возвращаемое значение равно NULL." > msdn GetActiveWindow () docs

Однако окна не просто всплывают - , поэтому вы должны извлечь дескриптор из того места, где вы / ваше приложение создали окно ... например. CreateWindow() возвращает HWND дескриптор, поэтому все, что вам нужно, это сохранить и получить его ...

5 голосов
/ 12 апреля 2010

Функция GetCurrentProcess() возвращает псевдо-дескриптор, который ссылается на текущий процесс. Этот дескриптор может использоваться в большинстве функций Win32 API, которые принимают параметр дескриптора процесса.

Документация содержит дополнительную информацию об этом псевдо-дескрипторе, в том числе о том, как преобразовать его в реальный дескриптор, если вам нужно.

2 голосов
/ 12 апреля 2010

Вы можете использовать HANDLE WINAPI GetCurrentProcess(void); из Kernel32.dll.

См. Запись MSDN здесь .

0 голосов
/ 11 октября 2018

Вот еще один ответ:

this-> GetSafeHwnd ();

0 голосов
/ 19 марта 2012

Мой пример не относится к процессу, но, возможно, вам нужно это:

HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX);

Возвращает HWND элемента управления, указанного его IDCL_COMBOBOX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...