Получение HWND текущего процесса

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

Ответ 1

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

Ответ 2

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

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

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

Фактически, теоретически HWND может иметь одно и то же "числовое" значение РУЧКИ, но они будут ссылаться на совершенно разные объекты.

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

Получить окно консоли

GetConsoleWindow();


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

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

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

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

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

Ответ 6

Мой пример - не обрабатывать процесс, но, возможно, вам это нужно:

HWND hwndList = GetDlgItem(hwnd, IDCL_COMBOBOX);

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