我一直在尝试学习如何使用SetWindowLongPtr()
并将其理解如下:
您可以使用以下函数获取当前消息并将其发送到自定义协议:
LONG_PTR Some_Ptr = SetWindowLongPtr(Some_Hwnd, GWLP_WNDPROC, (LONG_PTR)Custom_Proc);
创建自定义协议,示例如下:
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);
}
我的问题如下:
SetWindowLongPtr()
?如果您需要特定情况,请设想在WM_CREATE中创建Some_Hwnd
的按钮句柄。但我宁愿对其他情况保持开放。答案 0 :(得分:4)
这称为“对窗口进行子分类”。它是一种标准的Windows编程技术,允许修改无法修改其代码的窗口的行为。就像你的情况下内置的Button类一样。
有几个细节,比如对窗口的特定实例和全局子类进行子类化。超级分类,一种确保窗口在创建之前进行自定义的技术。这在SDK documentation以及任何有关本机winapi编程的书中都有详细描述。就像Petzold的“编程Windows”一样,如果你想破解winapi代码需要阅读。
答案 1 :(得分:3)
我觉得你很困惑。根据文档,GWLP_WNDPROC更改指定窗口的窗口过程,因此发送到该窗口的任何将来的消息都将转到新过程。它在我所知道的任何意义上都没有“抓住当前的信息”。