Windows API中HANDLE和HWND的区别



我正在尝试使用函数SetForegroundWindow(HWND hWnD)。我有一些句柄,但它不能作为上面函数的参数。我的句柄是一个线程,我想在前台运行它。

HWND和HANDLE之间有什么区别?

它们只是抽象的数据类型。

根据MSDN,HANDLEHWND定义为:

  • HANDLE是一个对象的句柄
  • HWND是窗口的句柄

因此,HWNDHANDLE,但并非所有的HANDLE都是HWND。事实上:

typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;

示例

除非你知道自己在做什么,否则你应该只传递HWNDSetForegroundWindow

HWND hWnd = FindWindow(NULL, "Calculator");
SetForegroundWindow(hWnd);

这首先获取一个名为"Calculator"的窗口的句柄(FindWindow),然后将该窗口带到前台。

"句柄"是一个通用术语,用于指代标识系统上资源(菜单、DLL模块、内存块等)的令牌。通常被称为"魔法cookie",它通常在您第一次创建资源时返回。然后将该句柄传递给API中负责处理资源的其他函数。然而,您通常不需要知道手柄是什么。有时它可能是一个指针,有时是一个数字,也许是一个结构,或者其他什么。这就是为什么他们使用HWND这样的名称来隐藏它,HWND只是用于识别窗口的句柄(由API函数"CreateWindow()"返回)。因此,您不会将"句柄"转换为HWND,然后再转换回来,因为HWND已经是一个"句柄"(只标识您创建的窗口)。

在此处找到http://forums.codeguru.com/showthread.php?135438-手柄和HWND

您可以使用FindWindow从应用程序获取hwndhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx

这应该允许您获得HWND,前提是您有要查找的C++句柄作为HWND?

HWND也是一个HANDLE,但却是全局的。也就是说,在一个进程的上下文中有效的HWND在另一个进程中也是有效的。

上的一些未记录的信息https://winterdom.com/dev/ui/wnd/.

最新更新