【问题标题】:How can I check keyboard key state within a mousemove event如何在 mousemove 事件中检查键盘键状态
【发布时间】:2012-12-18 20:22:38
【问题描述】:

我希望能够使用空格键来修改鼠标按住时的行为。在不知道更好的情况下,我想象它涉及两个(或三个)事件处理程序之间的某种协调 - mousemovekeydownkeyup。但我想知道是否有某种方法可以完全在一个事件处理程序中处理它 - mousemove

示例代码让我了解我希望能够做什么......

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (Keyboard.KeyDown == Keys.Space)
                {
                    /* Do modified behavour for left mouse being held down while 
                    space is also held down */
                }
                else
                {
                    // Do normal behavour for left mouse being held down
                }

            }
        }

这样的事情可能吗,还是我必须使用 keydown 事件处理程序将空格键的状态保存到类变量并使用鼠标移动处理程序检查它?

【问题讨论】:

    标签: c# visual-studio events


    【解决方案1】:

    可以使用 Control.ModifierKeys 和 Control.MouseButtons 来完成。但仅适用于 shift、ctrl 和 alt 等键。

        private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
    
            if ((Control.ModifierKeys & Keys.Shift) != 0)
            {
                if ((Control.MouseButtons & MouseButtons.Left) != 0)
                { // here you go
    
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      您应该在 KeyDown-Event 中设置一个变量并在 MouseEvent 中检查它:

      bool buttonpressed = false;
      private void KeyDown_Event(object s, System.Windows.Forms.KeyEventArgs e)
      {
         if(e.KeyCode == KeyCode.Space)
            buttonpressed = true;
         else
            buttonpressed = false;
      }
      
      private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
              {
                  if (e.Button == MouseButtons.Left)
                  {
                      if (buttonPressed)
                      {
                          /* Do modified behavour for left mouse being held down while 
                          space is also held down */
                      }
                      else
                      {
                          // Do normal behavour for left mouse being held down
                      }
      
                  }
              }
      

      【讨论】:

      • 谢谢。我知道我可以这样做,但认为使用三个独立的事件处理程序处理组合的物理动作可能会有点错误,但现在实现它可以完美地工作。
      【解决方案3】:

      我有一个变量来跟踪Keys.Space 何时处于Pressed 状态,然后用KeyUpKeyDown 事件触发它

       private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
            // Check if Key.Space pressed
            if(SpacePressed) {
                 // Do something
            }
       }
      
       private void KeyPressed_Event(object sender, KeyEventArgs e) {
            // Check if Key.Space pressed
            if(e.Key == Key.Space) {
                 SpacePressed = true;
            }
       }
      
       private void KeyRelease_Event(object sender, KeyEventArgs e) {
            // Check if Key.Space pressed
            if(e.Key == Key.Space) {
                 SpacePressed = false;
            }
       }
      

      【讨论】:

        【解决方案4】:

        您可以使用 PInvoke 调用 User32.dll 中的GetKeyState

        【讨论】:

          猜你喜欢
          • 2012-07-06
          • 1970-01-01
          • 2011-05-31
          • 2013-06-21
          • 1970-01-01
          • 1970-01-01
          • 2017-04-06
          • 1970-01-01
          相关资源
          最近更新 更多