0

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

4

2 回答 2

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不做任何输出的内部消息循环,不如自己编写代码。
  • 与功能无关,而只是因为当前的代码就像非常脏的衣服,确实起到了它的作用,但穿起来感觉不好:用WinMain标准的 C 和 C++ 替换微软的怪物main
于 2013-04-12T10:23:32.497 回答
1

对于全局挂钩,挂钩过程mouseHookProc应位于 DLL 中,以便可以将其注入进程。检查这个: http: //www.codeproject.com/Articles/1037/Hooks-and-DLLs

于 2013-04-12T10:16:55.033 回答