8

KeyboardProc がクラス CWidget の静的メンバーであるキーボード フックを作成しています。

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

};

CWidget::KeyboardProc 内で CWidget の非静的メンバーを呼び出したいと考えています。

それを行う最良の方法は何ですか?

KeyboardProc には、「this」ポインターを渡すことができる 32 ビット DWORD がありません。

4

1 に答える 1

7

おそらく一度に 1 つのキーボード フックだけをインストールする必要がある場合は、静的な 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;
于 2008-12-02T10:42:30.317 に答える