【问题标题】:WPF - Send Keys ReduxWPF - 发送密钥 Redux
【发布时间】:2010-11-18 18:42:18
【问题描述】:

因此,我使用了第三方 wpf 网格控件,该控件经过硬编码,仅接受某些击键来执行快捷反应,其中之一是 Shift-Tab。 但是,我的用户群习惯于按向上箭头和向下箭头并告诉他们“不”现在不是一个选项。所以我认为我唯一的选择是拦截预览键并发送不同的击键组合。

现在,我正在使用我在此处找到的以下代码在用户按下向下箭头时发送选项卡:

if (e.Key == Key.Down)
{
    e.Handled = true;
    KeyEventArgs eInsertBack = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab);
    eInsertBack.RoutedEvent = UIElement.KeyDownEvent;
    InputManager.Current.ProcessInput(eInsertBack);
}

但是,此方法的局限性在于您似乎无法模拟按下 Shift 按钮? WPF 似乎认为 Keyboard.Modifiers 能够“读取”Shift 或 Ctrl,但似乎没有任何工具可以以编程方式设置 Keyboard.Modifiers。有什么帮助吗?

【问题讨论】:

    标签: c# wpf keyboard wpf-controls keyboard-shortcuts


    【解决方案1】:

    我用下面的方式模拟你说的很好这不是你的意思吗?

    public Window1()
    {
        InitializeComponent();
    
    
        Loaded += new RoutedEventHandler(Window1_Loaded);
    }
    
    void Window1_Loaded(object sender, RoutedEventArgs e)
    {
        WebBrowser1_PreviewKeyDown(this, new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 1, Key.LeftShift));
        WebBrowser1_PreviewKeyDown(this, new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 1, Key.Tab));
    }
    
    private void WebBrowser1_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine(e.Key);
    }
    

    输出:

    LeftShift
    Tab
    

    【讨论】:

    • 谢谢,但我不认为是这样。我正在寻找的是同时 Shift-Tab 的击键组合。
    • 嗯,我明白了。这很奇怪,因为使用 Key.LeftShift | Key.Tab 出于某些奇怪但可能是充分的理由而导致 CtrlLeft。当我可以的时候,我会进行更多的调查
    • @REA_ANDREW:您会看到这种情况发生,因为Keys 不是可以组合的标志,它是Key.LeftShift = 116Key.Tab = 3 的枚举。结果是 119,它映射到 Key.RightCtrl = 119(当光标在 Key 上时,在 Visual Studio 中按 F12 打开定义)。
    【解决方案2】:

    试试这个

    System.Windows.Forms.SendKeys.SendWait("{Tab}");
    

    在 WPF 应用程序中,SendKeys.Send 不工作,但 SendWait 工作正常。

    【讨论】:

      【解决方案3】:

      像这样创建一个 MockKeyboardDevice(感谢 Jared Parsons):

      https://github.com/VsVim/VsVim/blob/master/Src/VimTestUtils/Mock/MockKeyboardDevice.cs

      用法:

      var modKey = ModifierKeys.Shift;
      var device = new MockKeyboardDevice(InputManager.Current)
          {
              ModifierKeysImpl = modKey
          };
      var keyEventArgs = device.CreateKeyEventArgs(Key.Tab, modKey);
      ...
      

      使用示例:

      https://github.com/jaredpar/VsVim/blob/master/Test/VimWpfTest/VimKeyProcessorTest.cs

      【讨论】:

        猜你喜欢
        • 2010-11-22
        • 2018-08-09
        • 1970-01-01
        • 2018-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        相关资源
        最近更新 更多