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

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

11 голосов
/ 12 августа 2009

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

Ответы [ 4 ]

4 голосов
/ 10 июля 2010

Я создал небольшую библиотеку, которая, вероятно, может помочь вам с насмешкой над клавишей Shift:

http://wpfsendkeys.codeplex.com/

http://blogs.msdn.com/b/kirillosenkov/archive/2010/07/09/wpf-sendkeys-or-mocking-the-keyboard-in-wpf.aspx

1 голос
/ 10 января 2013

Создайте MockKeyboardDevice как это (спасибо Джареду Парсонсу):

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

1 голос
/ 06 октября 2012

попробуйте

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

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

0 голосов
/ 12 августа 2009

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

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
...