代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

PreviewKeyDown没有看到alt修饰符

  •  27
  • paxdiablo  · 技术社区  · 15 年前

    我有一些代码(应该是)捕获击键。顶层窗口具有

    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 L CTRL R 调用相关函数。

    一旦我将修改器更改为使用 ModifierKeys.Alt ,它停止工作。换句话说,两者都不是 中高音 L 中高音 R 调用函数。

    我这里缺什么?

    2 回复  |  直到 15 年前
        1
  •  44
  •   Julien Lebosquain    15 年前

    万一 Alt 修饰语, e.Key 收益率 Key.System 真正的关键在于 e.SystemKey . 您可以使用以下代码始终获得正确的按键:

    Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
    
        2
  •  51
  •   Ray Burns    15 年前

    问题是,当按住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键或按下另一个键时,它被视为“系统”按键。在许多方面,系统按键的处理方式与普通按键不同。

    当Windows将按键传递给应用程序时,一切都会开始。正常的键关闭事件生成一个wm_键关闭,但是如果按下alt键,它将生成一个wm_键关闭。同样地,wm_keyup被转换成wm_syskeyup。

    在整个窗口中,包括在WPF中,alt键的特殊处理与包含“访问文本”的菜单项、按钮和标签一起使用。例如,如果一个按钮的内容为“说嗨”,那么按下alt-h将被视为一个按钮单击。

    当alt键关闭时,字母将以三对事件的形式出现:key down、keyup和textinput,每个事件都有其关联的预览版本。主要区别如下:

    • keydown和keyup事件的key属性设置为“key.system”,而不是实际按下的键,并且system key设置为实际按下的键。
    • textInput事件正常传递,但如果不使用,则作为accesskey处理。