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

时间:2013-04-12 10:05:33

标签: c++ windows hook mousemove mouse-hook

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

2 个答案:

答案 0 :(得分:2)

重新发布的代码:

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 ++代替Microsoft的WinMain怪物main

答案 1 :(得分:1)

对于全局钩子,钩子过程mouseHookProc应该在DLL中,以便它可以注入到进程中。 检查一下: http://www.codeproject.com/Articles/1037/Hooks-and-DLLs