快速的健全性检查:是否可以使用仿函数对窗口进行子类化?我遇到了一种情况,我想在win proc中有一些可用数据,但是已经使用了GWLP_USERDATA。仿函数似乎是一个不错的选择,但是我很难使它起作用。
基本知识如下:
class MyWinProc { // Win Proc Functor
public:
MyWinProc(ExternalClass* obj, HWND window) :
obj(obj), window(window) {
oldWinProc = SubclassWindow(window, this); // Apply Subclass
}
virtual ~MyWinProc() {
SubclassWindow(window, oldWinProc); // Remove Subclass
}
LRESULT CALLBACK operator()(HWND, UINT, WPARAM, LPARAM) {
switch( uMsg ) {
case WM_MOUSEMOVE: {
obj->onMouseMove(/*etc*/);
break;
}
}
return CallWindowProc(oldWinProc, hWnd, uMsg, wParam, lParam);
}
private:
ExternalClass* obj;
HWND window;
WNDPROC oldWinProc;
};
看起来一切都很好,但是当我在消息泵中单击DispatchMessage()时,出现“访问冲突写入位置0x00000000”,显然不是一个好兆头。删除对以上代码的调用,生活将再次幸福。 :(所以这甚至有可能,还是我完全以错误的方式去做呢?
最佳答案
GWLP_USERDATA不是存储与窗口关联的数据的唯一方法,您也可以使用SetProp()。
至少在x86上,您可以进行ATL样式转换(一小段asm代码,将您的类指针放在ecx中,然后跳转到wndproc),您可以在我发布的答案中找到一些与此相关的链接
关于c++ - 用仿函数对窗口进行子类化(Win32),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1353144/