SetWindowLongPtr()如何传递消息?

时间:2013-01-17 03:09:13

标签: c windows winapi messages

我一直在尝试学习如何使用SetWindowLongPtr()并将其理解如下:

  1. 您可以使用以下函数获取当前消息并将其发送到自定义协议: LONG_PTR Some_Ptr = SetWindowLongPtr(Some_Hwnd, GWLP_WNDPROC, (LONG_PTR)Custom_Proc);

  2. 创建自定义协议,示例如下:

    static LRESULT CALLBACK Custom_Proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
            case WM_COMMAND:
                MessageBox(hwnd,"This is a window","OKAY",NULL);
                break;
            default:
                return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam);
                break;  
        }
        return CallWindowProc((WNDPROC)Some_Ptr, hwnd, msg, wParam, lParam);
    }
    
  3. 我的问题如下:

    1. 我在这里遗漏了什么吗?这是对的吗?
    2. 你在哪里打SetWindowLongPtr()?如果您需要特定情况,请设想在WM_CREATE中创建Some_Hwnd的按钮句柄。但我宁愿对其他情况保持开放。

2 个答案:

答案 0 :(得分:4)

这称为“对窗口进行子分类”。它是一种标准的Windows编程技术,允许修改无法修改其代码的窗口的行为。就像你的情况下内置的Button类一样。

有几个细节,比如对窗口的特定实例和全局子类进行子类化。超级分类,一种确保窗口在创建之前进行自定义的技术。这在SDK documentation以及任何有关本机winapi编程的书中都有详细描述。就像Petzold的“编程Windows”一样,如果你想破解winapi代码需要阅读。

答案 1 :(得分:3)

我觉得你很困惑。根据文档,GWLP_WNDPROC更改指定窗口的窗口过程,因此发送到该窗口的任何将来的消息都将转到新过程。它在我所知道的任何意义上都没有“抓住当前的信息”。