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

时间:2009-10-29 18:53:34

标签: c# .net wpf keyboard-events

如何以编程方式创建一个模拟键盘上按键的事件?

5 个答案:

答案 0 :(得分:141)

问题是标记为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 }
  );

此解决方案不依赖于本机调用或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(...)将事件直接发送到目标 没有元处理,如 加速器,文本组成和 我。这通常是你想要的。 另一方面,如果你真的这样做 什么来模拟实际的键盘键 出于某种原因,你会使用 而是InputManager.ProcessInput()。

答案 1 :(得分:26)

在没有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;
}

虚拟键列表已定义here

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

答案 2 :(得分:22)

我没有使用它,但SendKeys可能会做你想要的。

  

使用SendKeys发送击键和   击键组合到活动   应用。这堂课不可能   实例化。发送击键到   上课并立即继续   你的程序流程,使用发送。至   等待由...启动的任何进程   按键,使用SendWait。

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

Microsoft还有一些使用示例here

答案 3 :(得分:10)

轻松! (因为其他人已经为我们做过工作......)

在花了很多时间用建议的答案尝试这个之后,我遇到了这个codeplex项目Windows Input Simulator ,这使得模拟按键很简单:

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

      

    Install-Package InputSimulator

  2. 使用以下两行代码:

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

  3. 那就是它!

答案 4 :(得分:7)

发送SendMessage API的Windows WM_KEYDOWN