Win32 鼠标和键盘组合

5
我需要在Win32中结合鼠标和键盘事件,比如Click+ShiftClick+Alt+Shift
例如(伪代码):
case WM_LBUTTONDOWN:

       if (Shift)
            //click+Shift
       if (Shift && Ctrl)
            //click+Shift+Ctrl
       if (Shift && Alt)
            //click+Shift+Alt
break;

我知道这里这里中的所有必要参数。
但我不知道如何正确地将它们组合起来。
4个回答

4
假设这是在您的winproc内部:

if(wParam & MK_SHIFT)
{
   if (wParam & MK_CONTROL && wParam & MK_SHIFT)
   {
     //click+Shift+Ctrl
   }
   else if(wParam & MK_SHIFT && HIBYTE(GetKeyState(VK_MENU)) & 0x80)
   {
        //alt+shift
   }
   else
   {
      //just shift
   }
}

Shift和click和alt键有点棘手,你需要使用不同的方式。

为什么呢?从WM_LBUTTONDOWN页面可以看出,对于每个发送的信号都有给定的参数。其中之一是wparam。它可以具有不同的值,这取决于是否按下了某些特殊键。

由于WM_LBUTTONDOWN信号的wparam不包含有关alt键的信息,因此您必须利用GetKeyState函数,该函数返回高位值为1的键是否按下,否则返回其他任何内容。


1
它适用于“wParam & MK_SHIFT”而不是“wParam == MK_SHIFT”,怎么了? - sysop
1
呵呵,你的观察是正确的。我在回答中犯了一个大错别字。Wparam 包含位标志,因此您必须使用逻辑 AND '&' 进行检查。 对于造成的困惑,我感到抱歉。 - Lefteris
2
嗯...从你在问题中发布的代码来看,我以为这就是你想要的功能。好吧...这只是一个程序流程的简单问题。我会修正我的答案以反映它。 - Lefteris

1
使用GetKeyState函数获取生成当前消息时修改键的状态。因此:
if (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) < 0) {
    // click+shift+ctrl
} else if (GetKeyState(VK_SHIFT) < 0) {
    // click+shift
}

等等。请注意,您需要在单个Shift键之前检查多键组合,否则即使按下其他修改键,单个Shift测试也会成功。


0

虽然有一段时间了,但是您的WndProc应该具有多个参数之一是wParam。 wParam将包含相关的虚拟键代码。根据您想要了解的深度,您可能需要一个内部开关,像这样:

switch (wParam)
{
   case MK_CONTROL:
   {
        // handle mouse and ctrl key down
        break;
    }
}

0
在我的目前的项目中,我们正在设置 WM_KEYDOWN 部分的标志位于 wndproc 中:
case WM_KEYDOWN:
{
switch(wParam)
    {
    case VK_CONTROL:
        {
            isHoldingCtrl = true;
        }
        break;
    case VK_SHIFT:
        {
            isHoldingShift = true;
        }
        break;
    case VK_NUMPAD1:
        }
            numPad = 1;
        }
        break;
    }
}
break;

这使我们能够使用任何键作为修饰符(例如,数字键盘键),这是我们在此项目中需要做的。然后我们在WM_KEYUP中定义“正常”键事件。

我并不是声称这一定是您特定问题的最佳解决方案,但它是另一个选项,并且非常适合某些需求集。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接