SetWindowsHookEx, KeyboardProc e membri non statici
Domanda
Sto creando un hook di tastiera, in cui KeyboardProc è un membro statico di una classe CWidget.
class CWidget
{
static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam );
};
Voglio chiamare i membri non statici di CWidget all'interno di CWidget :: KeyboardProc.
Qual è il modo migliore per farlo?
KeyboardProc non ha alcun DWORD a 32 bit in cui posso passare il puntatore 'this'.
Soluzione
Dato che probabilmente desideri installare un solo gancio per tastiera alla volta, aggiungi un membro pQuesto statico alla tua 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. */
};
Devi definire il membro statico:
// Widget.cpp
CWidget *CWidget::m_pThis = NULL;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow