SetWindowsHookEx, KeyboardProc и нестатические члены
Вопрос
Я создаю зацепку для клавиатуры, в которой KeyboardProc является статическим членом класса CWidget.
class CWidget
{
static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam );
};
Я хочу вызвать нестатические члены CWidget внутри CWidget :: KeyboardProc. Р>
Каков наилучший способ сделать это? Р>
KeyboardProc не имеет 32-битного DWORD, где я могу передать указатель 'this'.
Решение
Если вы, вероятно, хотите, чтобы за один раз устанавливался только один хук клавиатуры, просто добавьте статический член pThis в ваш класс:
// 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. */
};
Вам нужно определить статический член:
// Widget.cpp
CWidget *CWidget::m_pThis = NULL;
Не связан с StackOverflow