Pergunta

Estou criando um gancho de teclado, no qual KeyboardProc é um membro estático de uma classe CWidget.

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

};

Eu quero chamar os membros não-estáticos de CWidget dentro do CWidget :: KeyboardProc.

O que é a melhor maneira de fazê-lo?

KeyboardProc não tem qualquer DWORD de 32 bits onde eu possa passar o ponteiro 'this'.

Foi útil?

Solução

Uma vez que você provavelmente só quero um gancho de teclado instalado em um momento, basta adicionar um estático membro pThis a sua classe:

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

Você precisa definir o membro estático:

// Widget.cpp
CWidget *CWidget::m_pThis = NULL;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top