2010-06-23 36 views
25

我有一些代码(应该是)捕获击键。顶层窗口有一个PreviewKeyDown没有看到Alt修改器

Keyboard.PreviewKeyDown="Window_PreviewKeyDown" 

子句和支持CS文件包含:

private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { 
    if (e.KeyboardDevice.Modifiers == ModifierKeys.Control) { 
     switch (e.Key) { 
      case Key.L: 
       btnPrev_Click(sender, new RoutedEventArgs()); 
       e.Handled = true; 
       break; 
      case Key.R: 
       btnNext_Click(sender, new RoutedEventArgs()); 
       e.Handled = true; 
       break; 
     } 
    } 
} 

现在工作得很好,既CTRL大号CTRL[R调用相关功能。

只要我将修改器检查更改为使用ModifierKeys.Alt,它就会停止工作。换句话说,既不是ALTLALTR调用函数。

我在这里错过了什么?

回答

40

Alt修饰符的情况下,e.Key返回Key.System并且真正的关键在e.SystemKey。您可以使用下面的代码段始终得到正确的按键:

Key key = (e.Key == Key.System ? e.SystemKey : e.Key); 
+0

真棒。非常感谢。 – mbaytas 2014-05-05 13:00:29

47

麻烦的是,当Alt键不放你KeyEventArgs有:

Key = Key.System 
SystemKey = the real key 

所以Alt键检查,当您需要使用e.SystemKey代替e.Key,像这样:

if (e.KeyboardDevice.Modifiers == ModifierKeys.Alt) { 
    switch (e.SystemKey) { 
     ... 

说明

在Windows下,“Alt”键被专门处理。在按住Alt键的同时按下Alt键或按下另一个键时,它被视为“系统”按键。 “系统”按键在许多方面的处理方式与常规按键不同。

这一切都是在Windows将按键传递给应用程序时开始的。正常的按键事件会生成WM_KEYDOWN,但如果按下Alt键,则会生成WM_SYSKEYDOWN。同样,WM_KEYUP被转换成WM_SYSKEYUP。

在整个Windows中,包括在WPF中,Alt键的特殊处理都与包含“访问文本”的MenuItems,Buttons和Labels一起使用。例如,如果一个按钮的内容为“Say _Hi”,则将Alt-H作为一个按钮点击。

当Alt键关闭时,字母会以三对事件形式出现:KeyDown,KeyUp和TextInput,每个事件都有其关联的预览版本。主要区别在于:

  • KeyDown和KeyUp事件的Key属性设置为“Key.System”,而不是按下的实际键,SystemKey设置为按下的实际键。
  • textInput事件通常通过,但随后作为ACCESSKEY处理,如果它没有被消耗
+0

第二个代码块应该是“ModifierKeys.Alt”吗? – paxdiablo 2010-06-23 08:39:41

+1

谢谢,雷,解释是一个额外的好处,所以+1。 – paxdiablo 2010-06-23 08:45:41

+1

优秀的解释! +1为您主席 – Arcturus 2010-06-23 09:48:46