【问题标题】:The difference between the handle received in the WNDPROC window callback procedure vs the one returned by CreateWindow?WNDPROC 窗口回调过程中收到的句柄与 CreateWindow 返回的句柄之间的区别?
【发布时间】:2011-11-13 06:33:46
【问题描述】:

所以我想知道在使用CreateWindow/CreateWindowEx 创建窗口时返回的句柄与作为参数传递给相关窗口的WNDPROC 窗口回调过程的句柄之间是否有任何区别。这个问题的上下文是我需要使用某些需要窗口句柄的 API 函数,所以我认为与其传递窗口回调过程接收到的句柄,不如保存 CreateWindow 返回的句柄的副本一次,然后将其用于后续操作,以防两个句柄相同。

问候,

Devjeet

【问题讨论】:

  • 你为什么不比较它们呢?另外你为什么不想使用窗口回调过程收到的呢?
  • 不是我不想,只是如果有事能不通过就更好了。我使用的功能仅用于一个目的,并且只有一个窗口程序会使用它。所以它认为只一次保存句柄,而不是一直传递它也会更简单。

标签: c++ winapi


【解决方案1】:

这里要小心,窗口过程被一个窗口的多个实例使用。回调由 WNDCLASSEX.lpfnWndProc 的值确定,因此任何使用相同窗口类名称的 CreateWindow/Ex() 调用都使用相同的回调。如果您这样做是为了将回调映射到类实例方法,那么您首先必须通过一个 thunk 将回调的 hwnd 参数映射到类实例。当然是为 WM_CREATE 做一个特例。

【讨论】:

    【解决方案2】:

    是的,它们是相同的,这就是拥有 HWND 的全部意义所在。每个窗口只有一个HWND 在系统内标识它,并且在使用它调用DestroyWindow 之前一直有效。它由CreateWindow(EX) 返回并与每条消息一起发送,因此您可以将其用作窗口的唯一标识符,即使您创建了同一类的多个窗口。

    但请注意,有些消息甚至在CreateFunction 返回之前就已发送到窗口过程,因此如果您使用全局变量来保存您的HWND

    HWND globalHwnd = NULL;
    
    int main()
    {
        //...
        globalHwnd = CreateWindow(...);
    }
    
    LRESULT WndProc(HWND hWnd, ...)
    {
        assert(hWnd == globalHwnd); //fail!
    }
    

    断言会失败,因为WM_CREATE等几条消息在CreateWindow返回之前已经发送,所以全局变量还没有赋值。

    【讨论】:

    • 谢谢!顺便说一句,我会将它用作班级的成员。
    猜你喜欢
    • 2017-06-19
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2012-11-12
    • 2010-09-21
    相关资源
    最近更新 更多