当用户按下Ctrl并同时单击时,我想获得鼠标单击坐标X和Y. 用户可以点击屏幕或程序的任何位置。我希望我的程序捕获事件并在按下Ctrl键并同时鼠标单击时获取坐标。我想得到系统坐标X和Y,而不是其他程序的窗口坐标。 我正在使用C ++。
怎么做?
Windows操作系统,WIN API代码
我正在做下一个不起作用的事情:
HHOOK MouseHook;
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam){
PKBDLLHOOKSTRUCT k = (PKBDLLHOOKSTRUCT)(lParam);
POINT p;
if(wParam == WM_RBUTTONDOWN)
{
// right button clicked
GetCursorPos(&p);
//p.x
//p.y
//my program is never getting here, why ?
}
}
MouseHook = SetWindowsHookEx(WH_MOUSE_LL,(HOOKPROC)MouseHookProc,0,0);
如果我将上述行更改为:MouseHook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseHookProc,GetModuleHandle(NULL),0);
那么它只适用于我自己的程序窗口,但不能挂钩程序之外的点击次数
答案 0 :(得分:0)
我接近的方法是创建一个全局变量说
int ctrl_pressed = 0
/*
0 -- ctrl nt pressed
1 -- Crtl Pressed
*/
步骤1:现在我将为ctrl处理WM_KEYDOWN和WM_KEYUP
步骤2:在WM_KEYDOWN (if lparam is ctrl )
的回调中,我将ctrl_pressed设置为1。
如果是WM_KEYUP
,我会设置ctrl_pressed to 0.
第3步:现在最后处理WM_MOUSECLICKED
然后检查ctrl_pressed(global) is 1
是否为真,我可以得到坐标。
这只是一种方法可能不是最有效的解决方案。 等待更有经验的WIN32开发人员提供他们的输入。
答案 1 :(得分:0)
你读过这篇文章吗? link
首先,如果你想捕获系统整个鼠标+键盘事件,你的钩子函数必须放在一个DLL上。
1)如果nCode小于零,则钩子过程必须返回CallNextHookEx返回的值。 如下所示,
if(nCode < 0)
{
CallNextHookEx(hook, nCode, wParam, lParam);
return 0;
}
如果未调用CallNextHookEx
,则其他已安装挂钩的进程可能无法正确获取事件。
2)然后,再次检查nCode
,是否为HC_ACTION
。
switch (nCode)
{
case HC_ACTION:
...
3)最后,您可以检查WPARAM
WM_RBUTTONDOWN
和LPARAM
MSLLHOOKSTRUCT