26

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

HWND 和 HANDLE 有什么区别?

4

3 回答 3

43

它们只是抽象数据类型

根据MSDN,定义为HANDLEHWND

  • HANDLE是对象的句柄
  • HWND是窗口的句柄。

所以, aHWND是 a HANDLE,但不是所有HANDLE的 s 都是HWND。实际上:

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

例子

除非您知道自己在做什么,否则您应该只传递HWND给。SetForegroundWindow

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

这首先获取标题为“计算器”的窗口的句柄FindWindow,然后将该窗口带到前台。

于 2013-08-04T06:57:28.633 回答
15

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

在这里找到http://forums.codeguru.com/showthread.php?135438-Handle-and-HWND

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

这应该允许您获得 HWND,前提是您拥有您正在寻找的C++ 句柄作为 HWND 的句柄?

于 2013-08-04T06:51:52.637 回答
11

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

https://winterdom.com/dev/ui/wnd/上的一些无证信息。

于 2015-11-07T11:18:18.520 回答