如何以编程方式创建一个事件,该事件将模拟键盘上的按下键?
如何以编程方式创建一个事件,该事件将模拟键盘上的按下键?
Answers:
该问题被标记为WPF,但到目前为止的答案是特定的WinForms和Win32。
要在WPF中执行此操作,只需构造一个KeyEventArgs并在目标上调用RaiseEvent。例如,要将Insert key 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 }
);
另请注意:
控件希望接收预览事件,例如PreviewKeyDown应该在KeyDown之前
使用target.RaiseEvent(...)将事件直接发送到目标,而无需诸如加速器,文本合成和IME之类的元处理。这通常是您想要的。另一方面,如果出于某种原因确实执行了模拟实际键盘键的操作,则应改用InputManager.ProcessInput()。
Keyboard.PrimaryDevice.ActiveSource
见stackoverflow.com/questions/10820990/...
Ctrl+C
)
要在没有Windows Forms Context的情况下产生关键事件,我们可以使用以下方法,
[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
使用以下两行代码:
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
就是这样!
- - - -编辑 - - - -
由于某种原因,codeplex上的项目页面被标记,这是指向NuGet画廊的链接。
Windows SendMessage API,带有发送WM_KEYDOWN。