快速的健全性检查:是否可以使用仿函数对窗口进行子类化?我遇到了一种情况,我想在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/

10-12 00:02