Pregunta

Estoy creando un enlace de teclado, en el que KeyboardProc es un miembro estático de un CWidget de clase.

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

};

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

¿Cuál es la mejor manera de hacerlo?

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

¿Fue útil?

Solución

Dado que probablemente solo desee instalar un gancho de teclado a la vez, simplemente agregue un miembro pThis estático a su clase:

// Widget.h
class CWidget
{
    static HHOOK m_hHook;
    static CWidget *m_pThis;

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

    // Trampoline
    static LRESULT CALLBACK StaticKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
    {
        ASSERT(m_pThis != NULL);
        m_pThis->KeyboardProc(code, wParam, lParam);
    }

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

    /* etc. */
};

Debe definir el miembro estático:

// Widget.cpp
CWidget *CWidget::m_pThis = NULL;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top