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的键是否按下,否则返回其他任何内容。
if (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) < 0) {
// click+shift+ctrl
} else if (GetKeyState(VK_SHIFT) < 0) {
// click+shift
}
等等。请注意,您需要在单个Shift键之前检查多键组合,否则即使按下其他修改键,单个Shift测试也会成功。
虽然有一段时间了,但是您的WndProc应该具有多个参数之一是wParam。 wParam将包含相关的虚拟键代码。根据您想要了解的深度,您可能需要一个内部开关,像这样:
switch (wParam)
{
case MK_CONTROL:
{
// handle mouse and ctrl key down
break;
}
}
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中定义“正常”键事件。
我并不是声称这一定是您特定问题的最佳解决方案,但它是另一个选项,并且非常适合某些需求集。