SetWindowsHookEx, KeyboardProc и нестатические члены - PullRequest
8 голосов
/ 02 декабря 2008

Я создаю хук клавиатуры, где KeyboardProc является статическим членом класса CWidget.

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

};

Я хочу вызвать нестатические члены CWidget внутри CWidget :: KeyboardProc.

Каков наилучший способ сделать это?

KeyboardProc не имеет 32-битного DWORD, где я могу передать указатель «this».

1 Ответ

7 голосов
/ 02 декабря 2008

Учитывая, что вы, вероятно, хотите, чтобы одновременно устанавливался только один хук клавиатуры, просто добавьте статический член 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...