0

我一直在尝试学习如何使用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);
    }
    

我的问题如下:

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

2 回答 2

4

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

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

于 2013-01-17T20:33:14.377 回答
3

我想你很困惑。根据文档,GWLP_WNDPROC 更改指定窗口的窗口过程,因此发送到该窗口的任何未来消息都将转到新过程。在我所知道的任何意义上,它都不会“获取当前消息”。

于 2013-01-17T18:58:45.913 回答