检测按下的组合键是否是修饰符而不是修饰符

时间:2017-01-11 00:33:20

标签: c# forms keydown

我搜索了如何在c#中检测键盘组合。

在此之前,我使用表单的KeyDown事件KeyPreview = true

我需要检查e.Modifiers是否是任何修饰符,而e.KeyCode不是修饰符。

最好的是一个非常公开的声明,如:

if(Keys.Modifiers.Contains(e.Modifiers) && !Keys.Modifiers.Contains(e.KeyCode)){}

可悲的是,这不起作用。

这也不起作用,所有修饰键都适用。

if ((e.Modifiers == Keys.Alt || e.Modifiers == Keys.Control || e.Modifiers == Keys.Shift)
    && (e.KeyCode != Keys.Alt && e.KeyCode != Keys.Control && e.KeyCode != Keys.Shift))

这几乎正常,但由于没有Keys.AltKey,当点击ALT时它会变为真。

if ((e.Modifiers == Keys.Alt || e.Modifiers == Keys.Control || e.Modifiers == Keys.Shift)
    && (e.KeyCode != Keys.Alt && e.KeyCode != Keys.ControlKey && e.KeyCode != Keys.ShiftKey))

我怎么能这样做? e.KeyCode可能不是修饰符。

原因: 我需要让用户按下任意键组合至少一个修饰符和至少一个其他键的可能性。

正确获取声明后,如何将组合保存在变量中并在再次输入时进行检查是最好的方法?我考虑过在List<Keys>中保存每个输入的密钥(当一个是修改器而另一个不是)时,通过foreach检查它,return false;当输入的组合中的一个键时不在列表中。

一切都应该尽可能动态。

如何扩展以检查任何组合?与Ctrl + F + Shift + CCtrl + F + H

相同

谢谢!

迈克尔

2 个答案:

答案 0 :(得分:0)

可能最简单的方法是使用更低级别的API来获取当前按下的每个键的数组。这将使你的逻辑变得更容易,但你必须做一些花哨的进口。

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetKeyboardState(byte [] lpKeyState);

var array = new byte[256];
GetKeyboardState(array);

拥有阵列后,您可以同时扫描所有密钥而无需再进行O / S调用,这样可以减少开销。

例如,您可以看到有多少键被按下

int countKeys = array.Count(a => a & 0x80);

如果您只想检查是否按了左侧的Alt键,可以使用

bool leftAlt = (array[(byte)Key.LeftAlt] & 0x80);

答案 1 :(得分:0)

我认为你可能必须像John Wu所说的那样做,或者至少是一些低级别的方式,因为你必须记住按下的最后一个键。如果您使用“多个”CHARACTER键... NOT修饰键,那么您将必须记住最后一个键组合是什么。例如:Ctrl + F + Shift + C ...在查找“C”字符之前,您必须首先记住Ctrl + F + Shift部分。

无论何时使用多个“字符”键,您都必须记住序列中的第一个键。我不确定使用这么多密钥来完成某些事情会对用户友好。然而,来自@Vivelin How to get a combination of keys in c#的一个可能的解决方案似乎可以解决问题。它看起来很乱,只有两种不同的条件。

使用您的示例,假设我们正在寻找组合Ctrl + F + Shift + C当符合组合的第一部分Ctrl + F + Shift时,代码基本上将布尔值设置为true,然后退出。当按下下一个键并且组合为Ctrl + Shift + C时,您将知道已满足此组合Ctrl + F + Shift + C。这与其他程序类似,在这些程序中,您按住控制键,然后按下一个字符,然后同时按下另一个字符。在下面的代码中,我使用了一个禁用的文本框来组合触发组合。我希望这有帮助。

private bool keyCombo1 = false;
private bool keyCombo2 = false;

private void textBox1_KeyDown(object sender, KeyEventArgs e) {
  if (e.Control) {
    if (e.Shift) {
      if (e.KeyCode == Keys.F) {
        keyCombo1 = true;
      }
      else {
        if (e.KeyCode == Keys.C && keyCombo1) {
          textBox2.AppendText("Key Combo 1 hit" + Environment.NewLine);
        }
        else {
          keyCombo1 = false;
        }
      }
    }
    else {
      // control only no-shift
      if (e.KeyCode == Keys.F) {
        keyCombo2 = true;
      }
      else {
        if (e.KeyCode == Keys.H && keyCombo2) {
          textBox2.AppendText("Key Combo 2 hit" + Environment.NewLine);
        }
        else {
          keyCombo2 = false;
        }
      }
    }
  }
  else {
    // no control key pressed
  }
}