C++ 关于c+中鼠标挂钩的混淆+;

C++ 关于c+中鼠标挂钩的混淆+;,c++,windows,hook,mousemove,mouse-hook,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

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

第一段代码工作正常,它检测鼠标位置,我只是不知道如何将x,y数据输入到我的main中。

对于全局钩子钩子过程
mouseHookProc
应该在DLL中,以便可以将其注入进程。 选中此项:

对于全局钩子钩子过程
mouseHookProc
应该在DLL中,以便可以将其注入进程。 选中此项:

关于此发布代码:

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;
}
LRESULT回调mouseHookProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
PMSLLHOOKSTRUCT p=(PMSLLHOOKSTRUCT)lParam;
位置x=p->pt.x;
位置y=p->pt.y;
返回CallNextHookEx(NULL、nCode、wParam、lParam);
}
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR lpsz参数、int nCmdShow)
{
HHOOK mouseHook=setWindowshookx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
std::coutre此发布代码:

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;
}
LRESULT回调mouseHookProc(int-nCode、WPARAM-WPARAM、LPARAM-LPARAM)
{
PMSLLHOOKSTRUCT p=(PMSLLHOOKSTRUCT)lParam;
位置x=p->pt.x;
位置y=p->pt.y;
返回CallNextHookEx(NULL、nCode、wParam、lParam);
}
int WINAPI WinMain(HINSTANCE HINSTANCE、HINSTANCE hPrevInstance、LPSTR lpsz参数、int nCmdShow)
{
HHOOK mouseHook=setWindowshookx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);


最新的C++2011标准不知道鼠标。你肯定在谈论一些特定于系统的API(可能是Windows)。我认为,如果
mouseHookProc
在DLL中,全局鼠标钩子就可以工作。如何将输出放在
main
中的代码显示。您将代码放在main中的什么位置?MessageBox有自己的消息泵,在它被关闭之前不会返回。最新的C++2011标准不知道鼠标。您肯定在谈论一些系统规范ific API(可能是Windows)。我认为如果
mouseHookProc
在dll中,全局鼠标钩子就可以工作。如何将输出放在
main
中的代码显示。您将代码放在main中的什么位置?MessageBox有自己的消息泵,在它被关闭之前不会返回。如何从dll中获取鼠标位置?我以前从未使用过dll编码。从dl中l您可以使用
PostMessage
使用主应用程序窗口的句柄将详细信息发布到主应用程序。使用自定义消息,应用程序应该注册该消息。鼠标详细信息可以作为
PostMessage
wparam
lparam
传递。此外,还有几种方法可以获得该消息的句柄使用API的窗口。另一种方法是在加载dll时传递句柄。如何从dll中获取鼠标位置?我以前没有使用过dll编码。从dll中,您可以使用
PostMessage
将详细信息使用句柄发布到主应用程序窗口。使用自定义消息和application应该注册。鼠标详细信息可以作为
wparam
lparam
PostMessage
传递。还有几种方法可以使用API获取窗口句柄。另一种方法是在加载dll时传递句柄。我不小心将代码的第二部分粘贴错了,存在无限loop正在尝试输出位置。我认为由于钩子正在运行,它会不断更新位置。但是它不会。如果我将cout/msgbox更改为多个位置(msgbox,cout,msgbox,cout…,msgbox,cout),会更混乱然后按“确定”将显示位置,下一个“确定”将显示位置,依此类推。然而,当在无限循环中打印时,我的鼠标非常迟钝,我得到的只是0'sa消息循环反复调用
GetMessage
。对于每条消息,您通常会调用
TranslateMessage
DispatchMessage
。用标准的C和C++主替换微软的Win Mist怪兽。"这是如何产生成效的呢?在visual studio中,这只是在寻求痛苦,除非你还想摆弄链接器设置和项目设置。适应目标平台并遵循平台持有者的建议有什么错?我甚至可以称之为最佳实践…@jheriko:我理解你的情绪反应,我同情你我同意。不过,请放心,随着你对这些工具有了更多的经验,你也会对自己的判断有更多的信心,而对微软的信心则会减少。现在看起来不可能符合你的要求的东西,例如,哦,我们不能摆弄设置!哦,不!只会看起来是合理的;那些现在看起来很好的方式和设置来自微软的ct和他们一样,即使只是稍微看一眼,也会显示出严重的缺点和问题。你还没有做到。等一下,你就会做到。我不小心把代码的第二部分贴错了,有一个无限循环试图输出位置。我想既然钩子正在运行,它会不断更新位置。但是它不是。更混乱…如果我将cout/msgbox更改为多个(msgbox,cout,msgbox,cout…,msgbox,cout)然后按“确定”将显示位置,下一个“确定”将显示位置,依此类推。然而,当在无限循环中打印时,我的鼠标非常迟钝,我得到的只是0'sa消息循环反复调用
GetMessage
。对于每条消息,您通常会调用
TranslateMessage
DispatchMessage
。“用标准的C和C++主键替换微软的Win Maple,”这是如何生产的?在VisualStudio中,这只是要求痛苦,除非你想篡改链接器设置和项目设置。