Win32鼠标和键盘组合

时间:2012-02-09 04:44:00

标签: c++ winapi keyboard mouse

我需要在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;

我知道来自herehere的所有必要参数。

但我不知道如何正确地组合它们。

4 个答案:

答案 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中定义“普通”键事件。

我并不是说这对你的特定问题来说是最好的解决方案,但它是另一种选择,非常适合某些需求。