2008-12-02 67 views
6

我正在创建一个键盘钩子,其中KeyboardProc是一个类CWidget的静态成员。SetWindowsHookEx,KeyboardProc和非静态成员

class CWidget 
{ 
    static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam); 

}; 

我想在CWidget :: KeyboardProc中调用CWidget的非静态成员。

这样做的最佳方法是什么?

KeyboardProc没有任何32位的DWORD,我可以传递'this'指针。

回答

6

既然你可能只需要同时安装一个键盘钩子,只是一个静态pThis成员添加到您的类:

class CWidget 
{ 
    static HHOOK m_hHook; 
    static CWidget *m_pThis; 

public: 
    /* NOT static */ 
    bool SetKeyboardHook() 
    { 
     m_pThis = this; 
     m_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, /* etc */); 
    } 

    // Trampoline 
    static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam) 
    { return m_pThis->KeyboardProc(code, wParam, lParam); } 

    LRESULT KeyboardProc(int code, WPARAM wParam, LPARAM lParam); 

    /* etc. */ 
};