我如何以编程方式生成C#中的按键事件?

我怎样才能以编程方式创build一个事件来模拟在键盘上按下的键?

这个问题被标记为WPF,但到目前为止的答案是特定的WinForms和Win32。

要在WPF中这样做,只需构造一个KeyEventArgs并在目标上调用RaiseEvent。 例如,要将Insert键KeyDown事件发送到当前的焦点元素:

var key = Key.Insert; // Key to send var target = Keyboard.FocusedElement; // Target element var routedEvent = Keyboard.KeyDownEvent; // Event to send target.RaiseEvent( new KeyEventArgs( Keyboard.PrimaryDevice, PresentationSource.FromVisual(target), 0, key) { RoutedEvent=routedEvent } ); 

此解决scheme不依赖于本地调用或Windows内部,应该比其他更可靠。 它还允许您模拟特定元素上的按键。

请注意,此代码仅适用于PreviewKeyDown,KeyDown,PreviewKeyUp和KeyUp事件。 如果你想发送TextInput事件,你可以这样做:

  var text = "Hello"; var target = Keyboard.FocusedElement; var routedEvent = TextCompositionManager.TextInputEvent; target.RaiseEvent( new TextCompositionEventArgs( InputManager.Current.PrimaryKeyboardDevice, new TextComposition(InputManager.Current, target, text)) { RoutedEvent = routedEvent } ); 

另请注意:

  • 控件希望接收预览事件,例如PreviewKeyDown应该在KeyDown之前

  • 使用target.RaiseEvent(…)将事件直接发送到目标,不需要元数据处理,如加速器,文本合成和IME。 这通常是你想要的。 另一方面,如果由于某种原因真的要模拟实际的键盘键,则可以使用InputManager.ProcessInput()来代替。

我没有使用它,但SendKeys可以做你想做的。

使用SendKeys将击键和击键组合发送到活动的应用程序。 这个类不能被实例化。 要发送击键到类并立即继续您的程序的stream程,使用发送。 要等待按键启动的任何进程,请使用SendWait。

 System.Windows.Forms.SendKeys.Send("A"); System.Windows.Forms.SendKeys.Send("{ENTER}"); 

微软在这里有更多的使用示例。

为了生成没有Windows窗体上下文的关键事件,我们可以使用下面的方法,

 [DllImport("user32.dll")] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); 

示例代码如下:

 const int VK_UP = 0x26; //up key const int VK_DOWN = 0x28; //down key const int VK_LEFT = 0x25; const int VK_RIGHT = 0x27; const uint KEYEVENTF_KEYUP = 0x0002; const uint KEYEVENTF_EXTENDEDKEY = 0x0001; int press() { //Press the key keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0); return 0; } 

这里定义了虚拟键列表。

要获得完整的图片,请使用下面的链接, http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html

Windows SendMessage API与发送WM_KEYDOWN 。

容易! (因为别人已经为我们做了工作…)

花了大量的时间尝试这个build议的答案,我遇到了这个codeplex项目的Windowsinput模拟器 ,使得它可以很简单,可以模拟一个按键:

  1. 安装软件包,可以完成,也可以从NuGet软件包pipe理器或软件包pipe理器控制台完成,例如:

    安装包InputSimulator

  2. 使用这两行代码:

    inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

而就是这样!