• 对于键盘事件PreviewKeyDown、PreviewKeyUp、KeyDown、KeyUp,在其中检查当次事件是哪个按键触发的很简单,只需要判断KeyEventArgs类型的事件参数e的Key属性。
  • 如果需要判断修饰键(Alt、Ctrl、Shift)是否同时被按下,以Window.KeyDown事件为例,有两种写法:
private void Window_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyboardDevice.Modifiers == ModifierKeys.Control && e.Key == Key.H)
  {
    //同时按下了Ctrl + H键(H要最后按,因为判断了此次事件的e.Key)
    //修饰键只能按下Ctrl,如果还同时按下了其他修饰键,则不会进入
  }
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
  if (e.KeyboardDevice.Modifiers.HasFlag(ModifierKeys.Control) && e.Key == Key.H)
  {
    //同时按下了Ctrl + H键(H要最后按,因为判断了此次事件的e.Key)
    //修饰键只要按下了Ctrl,不管按没按其他修饰键,都会进入
  }
}

其中的e.KeyboardDevice.Modifiers,可以用Keyboard.Modifiers(Keyboard类的静态属性)来替换。

  • 另外,也可以利用Keyboard类的静态方法IsKeyDown,完全脱离事件参数e,来监听判断键盘按键(推荐) :
if (Keyboard.IsKeyDown(Key.LeftCtrl) && Keyboard.IsKeyDown(Key.H) && Keyboard.IsKeyDown(Key.C))
{
  //只要当下同时按下的键中包含LeftCtrl、H和C,就会进入
}

这种方式可以在任何时刻,检测多个组合按键(不一定是修饰键),并且对按键顺序和最后按的是哪个键没有要求。

  • 但是,以上方法有使用前提,都只在当前窗体获得焦点时有效。

如果焦点在别的窗体上,或者用户切换到别的应用程序时,则只好利用C#的平台调用功能,调用操作系统底层的dll,来进行监听了。

04-28 16:55