我正试图获得全球鼠标位置。我有一个可以获得鼠标位置的钩子工作,但它只能在钩子代码中访问它。尝试访问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数据输入我的主。
答案 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
中没有输出任何输出的内部消息循环,而是编写自己的代码。WinMain
怪物main
答案 1 :(得分:1)
对于全局钩子,钩子过程mouseHookProc
应该在DLL中,以便它可以注入到进程中。
检查一下:
http://www.codeproject.com/Articles/1037/Hooks-and-DLLs