如何将类实例传递给 LowLevelMouseProc?
Posted
技术标签:
【中文标题】如何将类实例传递给 LowLevelMouseProc?【英文标题】:How to pass class instance to LowLevelMouseProc? 【发布时间】:2016-07-15 12:08:06 【问题描述】:我正在实现处理全局鼠标点击的逻辑,我卡在需要从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
【问题讨论】:
【参考方案1】:低级鼠标钩子没有提供检索实例指针的机制。使用全局变量通常是最好的选择。
如果您无法使您的程序以这种方式运行,您将需要使用 thunk。该技术已在许多地方进行了讨论,网络搜索将提供更多详细信息。例如,我粗略地搜索了一下:http://zabkat.com/blog/hook-callback-thunk-x64.htm
【讨论】:
我想我可以使用全局变量,我只是觉得它很愚蠢。谢谢。 考虑使用RAW Input API 而不是低级鼠标钩子。然后您可以使用SetWindowsLongPtr()
、SetProp()
或SetWindowSubclass()
将您的类对象指针与接收WM_INPUT
消息的HWND 相关联。以上是关于如何将类实例传递给 LowLevelMouseProc?的主要内容,如果未能解决你的问题,请参考以下文章