8

如何在不按键盘按键的情况下触发按键事件?我尝试使用此处的解决方案,但出现以下异常:

'System.Windows.PresentationSource.FromVisual(System.Windows.Media.Visual)' 的最佳重载方法匹配有一些无效参数。

考虑Shift+A包含来自键盘的 2 个按键事件,我怎样才能在不按下键盘的情况下做到这一点?(让,只需在按钮单击的文本框中打印大写 A)

我的代码

var key = Key.A;                    // Key to send
var target = Keyboard.FocusedElement;    // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send

target.RaiseEvent(new System.Windows.Input.KeyEventArgs(Keyboard.PrimaryDevice, System.Windows.PresentationSource.FromVisual(target), 0, key) { RoutedEvent = routedEvent });
4

3 回答 3

11

System.Windows.Forms.SendKeys.Send()为我成功了。

有关高级说明和可用代码列表,请参阅方法文档

例如,要发送Shift+A我使用了SendKeys.Send("+(a)").

于 2013-03-22T19:13:46.653 回答
2

您需要转换为Visual

var key = Key.A;                    // Key to send
var target = Keyboard.FocusedElement;    // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send

target.RaiseEvent(new System.Windows.Input.KeyEventArgs(Keyboard.PrimaryDevice,
 System.Windows.PresentationSource.FromVisual((Visual)target), 0, key) { RoutedEvent = routedEvent });

您还可以指定您的目标是特定的文本框,例如:

var target = textBox1;    // Target element

代码实际所做的是触发特定元素的 keydown 事件。所以有一个 keydown 处理程序是有意义的:

private void textBox1_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{

}
于 2013-03-22T16:54:54.503 回答
0

模拟键盘事件的简单可靠的方法是使用 keybd_event api

你可以在这里得到参考

http://www.pinvoke.net/default.aspx/user32.keybd_event

这里有更多关于它的文章

http://www.codeproject.com/Articles/7305/Keyboard-Events-Simulation-using-keybd_event-funct

于 2013-03-22T16:09:57.017 回答