c# - 使用 WPF KeyDown 事件了解多个键

标签 c# wpf keyboard-events

我正在使用 WPF KeyDown 事件。您能否解释一下,当我按 Ctrl+F1 时,为什么这个条件成立?当我按 F1 时,Ctrl 已被按下,因此 !Keyboard.IsKeyDown(Key.LeftCtrl) 应该为 false。

编辑:

在下面的代码中,如果您按 Ctrl+F1 两条消息都会触发。但是,如果您更改这两个 if 语句的顺序,则只有“ctrlF1”消息会像应有的那样触发。我想得到关于这种奇怪行为的解释。

private void Window_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.F1 && Keyboard.IsKeyDown(Key.LeftCtrl))
    {
        MessageBox.Show("ctrlF1");
    }
    if (e.Key == Key.F1 && !Keyboard.IsKeyDown(Key.LeftCtrl))
    {
        MessageBox.Show("F1");
    }
}

最佳答案

区别如下:

  • 在您显示的代码中,进入处理程序时,按下 F1 并按下 Ctrl (第一个 if 子句的两个条件都为 true)。 MessageBox 阻塞线程。同时释放 Ctrl 键并单击该消息。然后代码继续执行,Ctrl 键不再被按下(第二个 if 子句的两个条件都为 true)
  • 如果切换 if 语句,则只有第一个 if 语句的第一个条件 (e.Key == Key.F1) 为 true。执行到第二个 if 语句,并且两个条件都为 true。显示 MessageBox,并停止执行,直至 MessageBox 关闭。

区别在于:按下 F1 键是在调用处理程序之前评估的,但检查 Keyboard.IsKeyDown(Key.LeftCtrl) 是在此时评估的,当该行代码执行时

关于c# - 使用 WPF KeyDown 事件了解多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30942875/

相关文章:

c# - 在应用策略模式时,是否有一种好的方法可以避免某些子类中未使用的方法参数?

c# - 如何以分钟为单位增加时间

c# - 在 WPF 中是否有使用后台 worker 的替代方法?

wpf - 如何在 WPF MVVM 应用程序中处理可绑定(bind)应用程序范围的变量?

c++ - 有没有可以查看XPS文档的C++代码?

javascript - 单击按钮时触发 ctrl+r、ctrl+a、ctrl+q 事件

c# - MVC 架构中的业务逻辑放在哪里?

wpf - WPF专注于带有控件模板的ListBox项

javascript - 嘿!我如何解决我的代码显然没有从浏览器的 KeyboardEvent 正确获取 .key 属性?

javascript - 通过 Greasemonkey 向窗口发送箭头键事件