Friday, March 4, 2011

SetWindowsHookEx, KeyboardProc and Non-static members

I am creating a keyboard hook, wherein KeyboardProc is a static member of a class CWidget.

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

};

I want to call the non-static members of CWidget inside the CWidget::KeyboardProc.

What is the best way to do it?

KeyboardProc does not have any 32 bit DWORD where I can pass the 'this' pointer.

From stackoverflow
  • Given that you probably only want one keyboard hook installed at a time, just add a static pThis member to your class:

    class CWidget
    {
        static HHOOK m_hHook;
        static CWidget *m_pThis;
    
    public:
        /* NOT static */
        bool SetKeyboardHook()
        {
            m_pThis = this;
            m_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, /* etc */);
        }
    
        // Trampoline
        static LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
        { return m_pThis->KeyboardProc(code, wParam, lParam); }
    
        LRESULT KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
    
        /* etc. */
    };
    

0 comments:

Post a Comment