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