c++中关于鼠标钩子的困惑

Confusion about mouse hooks in c++

本文关键字:鼠标 于鼠标 c++      更新时间:2023-10-16

我正在尝试获得全局鼠标位置。我有一个可以获得鼠标位置的钩子工作,但是它只能在钩子代码中访问它。试图访问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