2016-07-15 21 views
0

Ich implementiere Logik, um globale Mausklicks zu behandeln, und ich steckte in Moment, wo ich Daten von LowLevelMouseProc bekommen muss. Momentan setze ich eine globale Variable an der Stelle, an der ich die Instanz von MyClass erstelle, und ich kann von LowLevelMouseProc darauf zugreifen, aber ich nehme an, dass das nicht der richtige Ansatz ist.Wie Übergeben Klasseninstanz an LowLevelMouseProc?

Rahmen Haken:

g_myClass = this; 
SetWindowsHookEx(WH_MOUSE_LL, MyClass::MouseHookProc, LoadLibraryA("user32.dll"), 0); 

LowLevelMouseProc:

LRESULT CALLBACK MyClass::MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam) { 
    MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; 
    g_myClass.onClick(wParam, pMouseStruct->pt.x, pMouseStruct->pt.y); //isn't good 
} 

Antwort

2

Das niedrige Niveau Maus-Hook bietet keinen Mechanismus, mit dem Sie eine Instanz Zeiger abrufen können. Die Verwendung einer globalen Variablen ist oft die beste Option.

Wenn Sie Ihr Programm nicht auf diese Weise arbeiten können, müssen Sie einen Thunk verwenden. Diese Technik wurde an vielen Orten diskutiert, und eine Websuche liefert mehr Details. Zum Beispiel ergab eine kursorische Suche meinerseits: http://zabkat.com/blog/hook-callback-thunk-x64.htm

+0

Ich denke, ich kann mit globalen Variable gehen, ich dachte nur, es ist dumm. Vielen Dank. – Vladimirs

+0

Verwenden Sie die [RAW-Eingabe-API] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645536.aspx) anstelle eines Low-Level-Maus-Hooks. Sie können dann 'SetWindowsLongPtr()', 'SetProp()' oder 'SetWindowSubclass()' verwenden, um Ihren Klassenobjektzeiger mit dem HWND zu verknüpfen, der 'WM_INPUT' Nachrichten empfängt. –