用户按Ctrl键并单击时获取鼠标坐标

时间:2013-12-30 13:29:42

标签: c++ windows

当用户按下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); 那么它只适用于我自己的程序窗口,但不能挂钩程序之外的点击次数

2 个答案:

答案 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_RBUTTONDOWNLPARAM MSLLHOOKSTRUCT