SetWindowLongPtr() 如何传递消息?

hhe*_*bol 1 c windows winapi message

我一直在尝试学习如何使用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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  1. 我在这里错过了什么吗?它是否正确?
  2. 你打哪里电话SetWindowLongPtr()Some_Hwnd如果您需要特定情况,请想象在 WM_CREATE 中创建的按钮句柄。但我宁愿它对其他情况开放。

Han*_*ant 5

这称为“窗口子类化”。它是一种标准的 Windows 编程技术,允许修改您无法修改其代码的窗口的行为。就像您案例中的内置 Button 类一样。

有几个细节,例如对窗口的特定实例进行子类化与全局子类化。超级分类是一种确保窗口在创建之前得到自定义的技术。SDK 文档和任何有关本机 winapi 编程的书籍都对此进行了详细描述。就像 Petzold 的“Programming Windows”一样,如果您想破解 winapi 代码,则需要阅读。