Разница между HANDLE и HWND в Windows API?
Я пытаюсь использовать функцию SetForegroundWindow(HWND hWnD)
. У меня есть несколько ручек, но он не работает как параметр выше функции. Моя ручка - это поток, и я хочу запустить его на переднем плане.
В чем разница между HWND и ручкой?
Ответы
Ответ 1
Это просто абстрактные типы данных.
Согласно MSDN, HANDLE
и HWND
определяются как:
-
HANDLE
- handle для объекта.
-
HWND
- это дескриптор окна.
Итак, a HWND
является HANDLE
, но не все HANDLE
являются HWND
. Фактически:
typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;
Пример
Вы должны передавать только HWND
в SetForegroundWindow
, если не знаете, что делаете.
HWND hWnd = FindWindow(NULL, "Calculator");
SetForegroundWindow(hWnd);
Сначала он получает дескриптор окна "Калькулятор" с FindWindow
, а затем выводит это окно на передний план.
Ответ 2
"handle" - это общий термин, используемый для обозначения токена, который идентифицирует ресурс в системе (меню, модуль DLL, блок памяти и т.д.). Часто называемый "волшебным печеньем", он обычно возвращается при первом создании ресурса. Затем вы передаете этот дескриптор другим функциям API, отвечающим за обработку ресурса. Обычно вам не нужно знать, что такое ручка. Иногда это может быть указатель, иногда число, возможно, структура или что-то еще. Вот почему они скрывают его с помощью имен, таких как HWND, который является просто дескриптором, используемым для идентификации окна (возвращается функцией API "CreateWindow()" ). Поэтому вы не конвертируете "дескриптор" в HWND и обратно, так как HWND уже является "дескриптором" (который просто определяет созданные вами окна).
Найдено здесь http://forums.codeguru.com/showthread.php?135438-Handle-and-HWND
Вы можете использовать FindWindow для получения hwnd из приложения http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx
Это должно позволить вам получить HWND, если у вас есть дескриптор того, что вы ищете С++ Handle as HWND?
Ответ 3
HWND также является РУЧНОЙ, но глобальной.
То есть HWND, действительный в контексте одного процесса, также действителен в контексте другого процесса.
Некоторая недокументированная информация на http://forum.sysinternals.com/internal-wnd-structure-in-win7_topic24988.html.