2008-12-02 69 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. */ 
};