我需要在Win32中组合鼠标和键盘事件,例如Click
+ Shift 或Click
+ Alt + Shift < / KBD>
例如(伪代码):
case WM_LBUTTONDOWN:
if (Shift)
//click+Shift
if (Shift && Ctrl)
//click+Shift+Ctrl
if (Shift && Alt)
//click+Shift+Alt
break;
但我不知道如何正确地组合它们。
答案 0 :(得分:2)
假设这是在你的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 :(得分:1)
使用GetKeyState函数获取生成当前消息时修饰键的状态。所以:
if (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) < 0) {
// click+shift+ctrl
} else if (GetKeyState(VK_SHIFT) < 0) {
// click+shift
}
等等。请注意,您需要在单个shift键之前检查多键组合,否则即使其他一些修饰键已关闭,单班测试也会成功。
答案 2 :(得分:0)
已经有一段时间了,但你的wndproc应该有几个参数,其中一个是wParam。 wParam将具有相关的虚拟键代码。根据您想要获得的深度,您可能希望有一个内部开关,如下所示:
switch (wParam)
{
case MK_CONTROL:
{
// handle mouse and ctrl key down
break;
}
}
答案 3 :(得分:0)
在我当前的项目中,我们在wndproc的WM_KEYDOWN部分设置了标志:
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中定义“普通”键事件。
我并不是说这对你的特定问题来说是最好的解决方案,但它是另一种选择,非常适合某些需求。