SetWindowsHookEx, KeyboardProc e membros não-estáticos
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'.
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