【问题标题】:Difference between HANDLE and HWND in Windows API?Windows API 中 HANDLE 和 HWND 的区别?
【发布时间】:2013-08-05 02:44:12
【问题描述】:

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

HWND 和 HANDLE 有什么区别?

【问题讨论】:

    标签: winapi hwnd handles


    【解决方案1】:

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

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

    【讨论】:

    • “但一个全球性的”正是我想要的。谢谢队友。
    • 那个链接现在失效了。
    • HWND 是一种句柄,但不是HANDLE
    • @BenVoigt 两种类型都是指向指针的类型定义,因此在 C++ 或操作系统级别它们是相等的。
    【解决方案2】:

    “句柄”是一个通用术语,用于指代标识系统上资源(菜单、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?

    【讨论】:

    • 是的,tks!,但我可以从句柄转换为 hwnd 吗?
    • @Thangnv 这就像在问“我可以从 void * 转换为 int * 吗?”这取决于。你的手柄是什么?
    • 我的句柄是一个线程,我想在前台运行它,但它不是函数 SetForegroundWindow(HWND hWnD) 中的 HWND。
    • 我把它转换成 HWND hWnD = (HWND) myHanle;这不是错误,但我无法检查它是否运行。
    • @Thangnv SetForegroundWindow 是用于操作窗口而非线程的 API。
    【解决方案3】:

    他们只是abstract data types

    根据MSDNHANDLEHWND定义为:

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

    所以,HWNDHANDLE,但并非所有 HANDLEs 都是 HWND。事实上:

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

    示例

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

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

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

    【讨论】:

    • 只有在未定义 STRICT 时才使用这些类型定义。如果是,HWND 不再定义为 HANDLE,而是作为唯一且独立的数据类型。
    • @RemyLebeau typedef 部分引用自 the offical document。 (但我检查了标题,这是按照您描述的方式定义的。谢谢。)
    • HWND 肯定与HANDLE 无关,即使它们碰巧使用相同的指针大小的类型进行编译。 HWND 是窗口组件中数据结构的索引(user32.dll 和朋友),HANDLE 是内核中数据结构的索引。
    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2012-10-09
    • 2015-01-20
    • 2012-08-10
    • 1970-01-01
    相关资源
    最近更新 更多