Frage

Ich schaffe eine Tastatur Haken, wobei KeyboardProc ein statisches Element einer Klasse ist CWidget.

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

};

Ich will die nicht-statischen Member von CWidget innerhalb des CWidget :: KeyboardProc nennen.

Was ist der beste Weg, es zu tun?

KeyboardProc hat keine 32-Bit-DWORD, wo ich die 'this' Zeiger passieren kann.

War es hilfreich?

Lösung

Da Sie wahrscheinlich nur eine Tastatur-Hook zu einem Zeitpunkt installiert werden sollen, fügen Sie einfach ein statisches pThis Mitglied Ihre Klasse:

// 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. */
};

Sie müssen das statische Element definieren:

// Widget.cpp
CWidget *CWidget::m_pThis = NULL;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top