2014-02-20 6 views
1

Я пытаюсь отправить сложную комбинацию клавиш из кода. Под этим я подразумеваю отправку чего-то вроде Ctrl + Tab. Я попытался использовать KeyEventArgs следующим образом:Как отправить несколько нажатий клавиш из кода

KeyEventArgs args1 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.LeftCtrl); 
KeyEventArgs args2 = new KeyEventArgs(Keyboard.PrimaryDevice, Keyboard.PrimaryDevice.ActiveSource, 0, Key.Tab); 
args1.RoutedEvent = Keyboard.KeyDownEvent; 
args2.RoutedEvent = Keyboard.KeyDownEvent; 
InputManager.Current.ProcessInput(args1); 
InputManager.Current.ProcessInput(args2); 

Однако, это не работает. Кто-нибудь знает, как я могу это сделать?

ответ

1

Вы можете сделать, как это ...

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

MYKeyboardDevice

public sealed class MYKeyboardDevice : KeyboardDevice 
    { 
     private sealed class MYPresentationSource : PresentationSource 
     { 
      Visual _rootVisual; 

      protected override CompositionTarget GetCompositionTargetCore() 
      { 
       throw new NotImplementedException(); 
      } 

      public override bool IsDisposed 
      { 
       get { return false; } 
      } 

      public override Visual RootVisual 
      { 
       get { return _rootVisual; } 
       set { _rootVisual = value; } 
      } 
     } 

     private static RoutedEvent s_testEvent = EventManager.RegisterRoutedEvent(
       "Key Event", 
       RoutingStrategy.Bubble, 
       typeof(MYKeyboardDevice), 
       typeof(MYKeyboardDevice)); 

     public ModifierKeys ModifierKeysImpl; 

     public MYKeyboardDevice() 
      : this(InputManager.Current) 
     { 

     } 

     public MYKeyboardDevice(InputManager manager) 
      : base(manager) 
     { 

     } 

     protected override KeyStates GetKeyStatesFromSystem(Key key) 
     { 
      var hasMod = false; 
      switch (key) 
      { 
       case Key.LeftAlt: 
       case Key.RightAlt: 
        hasMod = HasModifierKey(ModifierKeys.Alt); 
        break; 
       case Key.LeftCtrl: 
       case Key.RightCtrl: 
        hasMod = HasModifierKey(ModifierKeys.Control); 
        break; 
       case Key.LeftShift: 
       case Key.RightShift: 
        hasMod = HasModifierKey(ModifierKeys.Shift); 
        break; 
      } 

      return hasMod ? KeyStates.Down : KeyStates.None; 
     } 

     public KeyEventArgs CreateKeyEventArgs(
      Key key, 
      ModifierKeys modKeys = ModifierKeys.None) 
     { 
      var arg = new KeyEventArgs(
       this, 
       new MYPresentationSource(), 
       0, 
       key); 
      ModifierKeysImpl = modKeys; 
      arg.RoutedEvent = s_testEvent; 
      return arg; 
     } 

     private bool RaiseEvents(UIElement target, RoutedEventArgs e, params RoutedEvent[] routedEventArray) 
     { 
      foreach (var routedEvent in routedEventArray) 
      { 
       e.RoutedEvent = routedEvent; 
       target.RaiseEvent(e); 
       if (e.Handled) 
       { 
        return true; 
       } 
      } 

      return false; 
     } 

     private bool HasModifierKey(ModifierKeys modKey) 
     { 
      return 0 != (ModifierKeysImpl & modKey); 
     } 
    } 
+0

Спасибо, Милан! Это прекрасно работает. – PeterBuilt

+1

Как вы делаете вызов InputManager? – strattonn

+0

Вы можете передать keyEventArgs и вызвать обработчик событий, можете ли вы рассказать, как вы хотите использовать этот код? –

0

Как насчет SendKeys.SendWait ("^ {Tab}")?

Добавить ссылку, и с помощью System.Windows.Forms

Используйте это в качестве эталона для других нажатий клавиш: http://www.autohotkey.com/docs/commands/Send.htm

0

Here список ключей, поддерживаемых InputManager.InputProcess, которые могут имитировать:

None : True 
Cancel : False 
Back : True 
Tab : True   <------- 
... [Skipped] ... 
LeftShift : False 
RightShift : False 
LeftCtrl : False <------- 
RightCtrl : False 

Я попробовал ваш пример и Tab для меня работал отлично, но не с LeftCtrl. В этой ситуации, я думаю, нужно искать альтернативы. Кроме того, как я понимаю, этим методом (возможно, другим стандартным методом) не будет работать объединение нескольких клавиш.

В качестве одного из вариантов:

WPF Sendkeys project - Information about project

Этот проект обеспечивает поддержку SendKeys для WPF UiElements (для тестирования пользовательского интерфейса в процессе).

0

Как насчет просто реагирует на событие "KeyUp", сохранить первый ключ, проверьте комбинацию во второй раз вы нажимаете клавишу, и если она соответствует одному из ваших требований, сделайте что-нибудь?

Это было бы очень просто сделать.

Смежные вопросы