如何将类实例传递给 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?的主要内容,如果未能解决你的问题,请参考以下文章

将类对象实例作为参数从 main() 传递给另一个类对象实例

如何将类成员变量传递给另一个组件角度?

将类类型传递给泛型

如何使用 weka 中保存的模型将类分配给实例

c#将类实例传递为null而不是作为ref [重复]

Java - 将类传递给函数