WPF - Отправить ключи Redux

Итак, я использую элемент управления сетью 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. Любая помощь там?

Ответ 2

попробуйте это

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

В приложении WPF SendKeys.Send не работает, но SendWait работает нормально.

Ответ 3

Создайте 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

Ответ 4

Я имитирую то, что вы говорите, используя следующее: это не то, что вы имеете в виду?

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