【问题标题】:Win32 Mouse and Keyboard combinationWin32键鼠组合
【发布时间】:2012-03-01 14:37:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ winapi keyboard mouse


    【解决方案1】:

    假设这是在你的 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 和单击以及 alt 有点棘手,您必须使用不同的方式

    为什么会这样?您会从WM_LBUTTONDOWN 页面注意到,对于发送的每个信号,您都有给出的参数。其中之一是 wparam。根据是否按下某些特殊键,它可以具有不同的值

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

    【讨论】:

    • 它适用于“wParam & MK_SHIFT”而不是“wParam == MK_SHIFT”,有什么问题?
    • 呵呵正确观察。我在回答中犯了一个很大的错字。 Wparam 包含位标志,因此您必须使用逻辑 AND '&' 进行检查。很抱歉造成混乱。
    • 嗯 ...从您在问题中发布的代码来看,我认为这是您想要的功能。嗯..这只是程序流程的一个简单问题。我会修正我的答案以反映它。
    【解决方案2】:

    使用GetKeyState 函数获取当前消息生成时修饰键的状态。所以:

    if (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) < 0) {
        // click+shift+ctrl
    } else if (GetKeyState(VK_SHIFT) < 0) {
        // click+shift
    }
    

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

    【讨论】:

      【解决方案3】:

      已经有一段时间了,但是您的 wndproc 应该有几个参数,其中一个是 wParam。 wParam 将包含有问题的虚拟键代码。根据您想要获得的深度,您可能需要一个内部开关,如下所示:

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

      【讨论】:

        【解决方案4】:

        在我当前的项目中,我们在 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 中定义“正常”键事件。

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

        【讨论】:

          猜你喜欢
          • 2017-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          • 2018-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多