如何将 class 实例传递给 LowLevelMouseProc?
How to pass class instance to LowLevelMouseProc?
我正在实施处理全局鼠标点击的逻辑,但我卡在需要从 LowLevelMouseProc 获取数据的时刻。目前,我在创建 MyClass 实例时设置全局变量,并且我能够从 LowLevelMouseProc 访问它,但我认为这不是正确的方法。
设置挂钩:
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
}
低级鼠标挂钩不提供检索实例指针的机制。使用全局变量通常是最好的选择。
如果您不能使您的程序以这种方式运行,您将需要使用 thunk。该技术已在许多地方进行过讨论,网络搜索将提供更多详细信息。例如,我的粗略搜索产生了这个:http://zabkat.com/blog/hook-callback-thunk-x64.htm
我正在实施处理全局鼠标点击的逻辑,但我卡在需要从 LowLevelMouseProc 获取数据的时刻。目前,我在创建 MyClass 实例时设置全局变量,并且我能够从 LowLevelMouseProc 访问它,但我认为这不是正确的方法。
设置挂钩:
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
}
低级鼠标挂钩不提供检索实例指针的机制。使用全局变量通常是最好的选择。
如果您不能使您的程序以这种方式运行,您将需要使用 thunk。该技术已在许多地方进行过讨论,网络搜索将提供更多详细信息。例如,我的粗略搜索产生了这个:http://zabkat.com/blog/hook-callback-thunk-x64.htm