WPF - Send Keys Redux

11,008

Solution 1

try this

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

In WPF Application, SendKeys.Send not working, But SendWait is working fine.

Solution 2

Create a MockKeyboardDevice like this (kudos to Jared Parsons):

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

Usage:

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

A usage example:

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

Share:
11,008
mmccurrey
Author by

mmccurrey

Updated on July 07, 2022

Comments

  • mmccurrey
    mmccurrey almost 2 years

    So, I'm using a third-part wpf grid control that is hard-coded to only accept certain keystrokes to perform short-cut reactions and one of those is Shift-Tab. However, my user-base is used to hitting up arrow and down arrow and telling them 'no' isn't an option right now. So my only option I think is to intercept the preview key down and send a different key stroke combination.

    Now, I am using the following code that I found on here to send a Tab when the user presses the Down arrow:

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

    However, this method is limited in that you don't seem to be able to simulate a press of the Shift Button? WPF seems to look at the Keyboard.Modifiers to be able to 'read' a Shift or Ctrl, but there doesn't seem to be any facility to Set the Keyboard.Modifiers programatically. Any help out there?

  • mmccurrey
    mmccurrey over 14 years
    Thanks, but I don't think this is it. What I'm looking for is a key-stroke combination of Shift-Tab at the same time.
  • REA_ANDREW
    REA_ANDREW over 14 years
    hmm I see. It is weird because using Key.LeftShift | Key.Tab results in a CtrlLeft for some weird but probably good reason. I will have a little more investigation when I can
  • Dirk Vollmar
    Dirk Vollmar over 14 years
    @REA_ANDREW: You see this happening because Keys are not flags that can be combined, it's an enumeration where Key.LeftShift = 116 and Key.Tab = 3. The result is 119 which maps to Key.RightCtrl = 119 (Press F12 in Visual Studio when the cursor is on Key to open the definition).