c++中关于鼠标钩子的困惑
Confusion about mouse hooks in c++
我正在尝试获得全局鼠标位置。我有一个可以获得鼠标位置的钩子工作,但是它只能在钩子代码中访问它。试图访问main中的数据不工作。
最好的解释方式是用代码:
LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
position.x = p->pt.x;
position.y = p->pt.y;
std::cout<<position.x<<std::endl;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
MessageBox(NULL, "Press OK to close.", "", MB_OK);
return 0;
}
使用上面的代码,移动鼠标将显示控制台窗口中的新位置。然而,如果我把std::cout<<position.x<<std::endl;
放到main里面,它就会说0。position
是一个全局变量
输出在main:
内时的代码LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
position.x = p->pt.x;
position.y = p->pt.y;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
for(;;)
{
std::cout<<position.x<<std::endl;
}
MessageBox(NULL, "Press OK to close.", "", MB_OK);
return 0;
}
第一个代码块工作得很好,它检测鼠标位置,我只是不知道如何获得x,y数据到我的主。
此张贴代码:
LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
position.x = p->pt.x;
position.y = p->pt.y;
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
std::cout<<position.x<<std::endl;
MessageBox(NULL, "Press OK to close.", "", MB_OK);
return 0;
}
下面是main函数指定的应该发生的事情:
- 首先,调用
SetWindowsHookEx
(只发生一次)。 - 然后输出
position
(只发生一次)。 - 然后,显示
MessageBox
(只发生一次)。
。
在调用MessageBox
期间,钩子子程被调用(无论何时移动鼠标),但它不做任何可见的事情,只是一个内部更新。
你为什么期望更多?
如何修复:
- 不要依赖
MessageBox
中的内部消息循环,它不做任何输出,而是自己编写代码。 - 与功能无关,而只是因为当前的代码就像非常脏的衣服,确实服务于它的目的,但感觉不太好穿:用标准的C和c++
main
代替微软的WinMain
怪物。
对于全局钩子,钩子子程mouseHookProc
应该在DLL中,以便它可以被注入到进程中。检查:http://www.codeproject.com/Articles/1037/Hooks-and-DLLs
相关文章:
- WinAPI挂钩鼠标
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- 跟踪滚动条上的鼠标事件
- SendInput()鼠标移动计算
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- 如何在鼠标挂钩过程中检测拖动
- Win32 发送输入鼠标移动滞后并冻结
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 在 macOS 中使用 C/C++ 设置鼠标光标图像
- 如何通过拖动鼠标QT检查按钮?鼠标移动事件
- SDL2 调整窗口大小后如何缩放鼠标坐标?
- 如何在QSplashScreen中禁用鼠标单击
- C++鼠标单击时的屏幕截图不起作用
- 如何将鼠标坐标转换为"mm"
- 标签检测鼠标单击 c++
- 低级鼠标挂钩-鼠标在断点处冻结
- 获取缩放相对于鼠标产生的偏移
- QML 鼠标在鼠标区域中的绝对位置
- Qt旋转/移动自定义项目相对于鼠标