【问题标题】:Keyboard modifiers during application startup应用程序启动期间的键盘修饰符
【发布时间】:2010-10-22 14:36:33
【问题描述】:

我想捕获在应用程序启动期间是否按下了修改键(以确定全屏还是窗口)。

在主窗口构造函数中,我尝试检查 Keyboard.Modifiers 枚举以查看 Shift 是否关闭。它总是显示“无”。

所以我尝试了一种不同的方法,从 DispatcherTimer 开始并检查其 Tick 事件中的转变。这似乎工作正常。

问题是,这是最好的(唯一的)方法吗?以及为什么修饰符在窗口构造函数中没有返回正确的值?

【问题讨论】:

    标签: wpf keyboard


    【解决方案1】:

    Keyboard.Modifiers 是要使用的正确类/属性。

    我建议在 FrameworkElement.Loaded 事件的处理程序中检查修饰符。

    InitializeComponent()之后的Window构造函数中:

    this.Loaded += new RoutedEventHandler(Window_Loaded);
    

    还有:

    void Window_Loaded(object sender, RoutedEventArgs e)
    {
        // Examine Keyboard.Modifiers and set fullscreen/windowed
        if ((Keyboard.Modifiers & ModifierKeys.Shift) > 0)
        {
            //SetFullscreen();
        }
    }
    

    【讨论】:

    • 是的 - 比计时器方法更好。但是知道为什么修饰符在构造函数中不起作用吗?
    • 不确定。键盘类/设备必须尚未初始化,因为应用程序刚刚启动。
    • 我猜你可以在稍后创建的控件的构造函数中使用 Keyboard.Modifiers,而不是主窗口,因为应用程序刚刚启动。
    【解决方案2】:

    我敢打赌Keyboard.Modifiers 在幕后使用GetKeyState,这在您的消息循环发送第一条消息之前可能不起作用。 GetAsyncKeyState 对你有用(我猜是通过 P/Invoke,除非有一种我不知道的 .net 调用方式)。

    【讨论】:

      【解决方案3】:

      太棒了summary...第二个链接有很棒的代码可以在这个过程中显示它...只需添加 Josh G 的代码(从这个问题的答案到第二个链接中的项目):

      在InitializeComponent()之后的Window构造函数中:

      this.Loaded += new RoutedEventHandler(Window_Loaded);
      

      还有:

      void Window_Loaded(object sender, RoutedEventArgs e)
      {
          // Examine Keyboard.Modifiers and set fullscreen/windowed
          if ((Keyboard.Modifiers & ModifierKeys.Shift) > 0)
          {
              MessageBox.Show("The Window is Shifty...");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 2019-11-16
        • 2015-11-17
        • 2015-02-07
        相关资源
        最近更新 更多