WPF-发送密钥后退

问题描述 投票:11回答:3

因此,我使用的是第三方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
3个回答
1
投票

尝试一下

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

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


1
投票

创建这样的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


0
投票

我模拟使用以下内容您所说的还好,这不是您的意思吗?

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
© www.soinside.com 2019 - 2024. All rights reserved.