2008-12-02 19 views
6

Estoy creando un gancho de teclado, en el que KeyboardProc es un miembro estático de un Cwidget de clase.SetWindowsHookEx, KeyboardProc y miembros no estáticos

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

}; 

Quiero llamar a los miembros no estáticos de CWidget dentro del CWidget :: KeyboardProc.

¿Cuál es la mejor manera de hacerlo?

KeyboardProc no tiene ningún DWORD de 32 bits donde puedo pasar el puntero 'this'.

Respuesta

6

Teniendo en cuenta que es probable que sólo quiere un gancho de teclado instalado a la vez, sólo tiene que añadir un miembro pThis estática a su clase:

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. */ 
}; 
Cuestiones relacionadas