如何以编程方式创建一个模拟键盘上按下的键的事件?
5 回答
该问题被标记为 WPF,但到目前为止的答案是特定的 WinForms 和 Win32。
要在 WPF 中执行此操作,只需构造一个 KeyEventArgs 并在目标上调用 RaiseEvent。例如,向当前焦点元素发送一个插入键 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 }
);
此解决方案不依赖本机调用或 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 }
);
另请注意:
控件期望接收 Preview 事件,例如 PreviewKeyDown 应该在 KeyDown 之前
使用 target.RaiseEvent(...) 将事件直接发送到目标,无需诸如加速器、文本合成和 IME 之类的元处理。这通常是你想要的。另一方面,如果您出于某种原因真的要模拟实际的键盘键,则可以改用 InputManager.ProcessInput()。
要在没有 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
我没有使用它,但SendKeys可能会做你想做的事。
使用 SendKeys 将击键和击键组合发送到活动应用程序。这个类不能被实例化。要将击键发送到类并立即继续您的程序流程,请使用发送。要等待按键启动的任何进程,请使用 SendWait。
System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");
Microsoft在此处提供了更多使用示例。
容易地!(因为其他人已经为我们完成了工作......)
在花了很多时间尝试使用建议的答案之后,我遇到了这个 codeplex 项目Windows Input Simulator,它使模拟按键变得非常简单:
安装包,可以通过 NuGet 包管理器或包管理器控制台完成,例如:
安装包 InputSimulator
使用这 2 行代码:
inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
就是这样!
- - - -编辑 - - - -
由于某种原因,codeplex 上的项目页面被标记,这是 NuGet 库的链接。
带有发送WM_KEYDOWN的Windows SendMessage API。