【发布时间】:2013-08-05 02:44:12
【问题描述】:
我正在尝试使用函数SetForegroundWindow(HWND hWnD)。我有一些句柄,但它不能作为上述函数的参数。我的句柄是一个线程,我想在前台运行它。
HWND 和 HANDLE 有什么区别?
【问题讨论】:
我正在尝试使用函数SetForegroundWindow(HWND hWnD)。我有一些句柄,但它不能作为上述函数的参数。我的句柄是一个线程,我想在前台运行它。
HWND 和 HANDLE 有什么区别?
【问题讨论】:
HWND 也是一个 HANDLE,但它是一个全局的。 IE。在一个进程的上下文中有效的 HWND 在另一个进程的上下文中也有效。
https://winterdom.com/dev/ui/wnd/ 上的一些未记录信息。
【讨论】:
HWND 是一种句柄,但不是HANDLE。
“句柄”是一个通用术语,用于指代标识系统上资源(菜单、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++ Handle as HWND?
【讨论】:
void * 转换为 int * 吗?”这取决于。你的手柄是什么?
SetForegroundWindow 是用于操作窗口而非线程的 API。
他们只是abstract data types。
根据MSDN,HANDLE和HWND定义为:
HANDLE 是一个对象的handle。HWND 是窗口句柄。所以,HWND 是 HANDLE,但并非所有 HANDLEs 都是 HWND。事实上:
typedef void *PVOID;
typedef PVOID HANDLE;
typedef HANDLE HWND;
除非您知道自己在做什么,否则您应该只将HWND 传递给SetForegroundWindow。
HWND hWnd = FindWindow(NULL, "Calculator");
SetForegroundWindow(hWnd);
这首先使用FindWindow 获取标题为“计算器”的窗口的句柄,然后将该窗口置于前台。
【讨论】:
STRICT 时才使用这些类型定义。如果是,HWND 不再定义为 HANDLE,而是作为唯一且独立的数据类型。
typedef 部分引用自 the offical document。 (但我检查了标题,这是按照您描述的方式定义的。谢谢。)
HWND 肯定与HANDLE 无关,即使它们碰巧使用相同的指针大小的类型进行编译。 HWND 是窗口组件中数据结构的索引(user32.dll 和朋友),HANDLE 是内核中数据结构的索引。