WPF – 发送密钥Redux

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

现在,我使用以下代码在此处发送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。 有帮助吗?

试试这个

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

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

像这样创建一个MockKeyboardDevice(对Jared Parsons的赞誉):

https://github.com/jaredpar/VsVim/blob/master/Test/VimCoreTest/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

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

 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); } 

OUTPUT:

 LeftShift Tab