gpt4 book ai didi

c++ - 关于c++中鼠标钩子(Hook)的困惑

转载 作者:行者123 更新时间:2023-11-28 00:46:45 26 4
gpt4 key购买 nike

我正在尝试获取全局鼠标位置。我有一个可以获取鼠标位置的 Hook ,但是它只能在 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 数据放入我的主程序中。

最佳答案

重新发布代码:

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 期间,会调用 Hook 过程(无论何时移动鼠标),但它不会做任何可见的事情,只是内部更新。

为什么你期望更多?


如何修复:

  • 不要依赖 MessageBox 中的内部消息循环,它不执行任何输出,而是编写您自己的代码。
  • 与功能无关,只是因为当前的代码就像很脏的衣服,确实能达到目的,但穿起来感觉不舒服:用标准的 C 和 C++ 替换微软的 WinMain 怪兽 主要

关于c++ - 关于c++中鼠标钩子(Hook)的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15968520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com