2008-12-02 2 views
6

Я создаю крючок для клавиатуры, в котором KeyboardProc является статическим членом класса CWidget.SetWindowsHookEx, KeyboardProc и Non-static members

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

}; 

Я хочу, чтобы вызвать нестатические членов CWidget внутри CWidget :: KeyboardProc.

Каков наилучший способ сделать это?

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. */ 
}; 
Смежные вопросы