我创建一个键盘钩子,其中KeyboardProc是一个类的一个静态成员CWidget。

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

};

我想调用CWidget的CWidget :: KeyboardProc内的非静态成员。

什么是做到这一点的最好方法是什么?

KeyboardProc不具有任何32位DWORD哪里可以通过“这个”的指针。

有帮助吗?

解决方案

既然你可能只需要同时安装一个键盘钩子,只是一个静态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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top