Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中以编程方式生成按键事件?_C#_.net_Wpf_Keyboard Events - Fatal编程技术网

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

如何在C#中以编程方式生成按键事件?,c#,.net,wpf,keyboard-events,C#,.net,Wpf,Keyboard Events,如何以编程方式创建一个事件来模拟键盘上按下的键?我没有使用过它,但可以执行您想要的操作 使用SendKeys发送击键和 将按键组合设置为激活状态 应用该类不能为空 实例化。将击键发送到 上课并立即继续学习 在程序的流程中,使用Send。到 等待服务器启动的任何进程 击键时,使用SendWait Microsoft还有一些使用示例。Windows with send。问题被标记为WPF,但到目前为止,答案是特定的WinForms和Win32 要在WPF中实现这一点,只需构造一个KeyEventAr

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

我没有使用过它,但可以执行您想要的操作

使用SendKeys发送击键和 将按键组合设置为激活状态 应用该类不能为空 实例化。将击键发送到 上课并立即继续学习 在程序的流程中,使用Send。到 等待服务器启动的任何进程 击键时,使用SendWait


Microsoft还有一些使用示例。

Windows with send。

问题被标记为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 应该在按键关闭之前

  • 使用target.RaiseEvent(…)将事件直接发送到目标 没有元处理,例如 加速器、文本合成和 输入法。这通常是你想要的。 另一方面,如果你真的这么做了 如何模拟实际的键盘键 出于某种原因,您会使用 改为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;
}
定义了虚拟键的列表

要获得完整的图片,请使用以下链接, 轻松! (因为其他人已经为我们做了工作…)

在花了大量时间尝试使用建议的答案后,我遇到了这个codeplex项目,它使模拟按键变得非常简单:

  • 可以通过NuGet package manager或package manager控制台安装软件包,如:

    安装软件包输入模拟器

  • 使用以下两行代码:

    inputSimulator=新的inputSimulator()
    inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

  • 就这样

    -------编辑--------



    codeplex上的项目页面由于某种原因被标记,是指向NuGet gallery的链接。

    您是否只需要启动事件?我想您必须进入非托管代码才能模拟“真实”按键。是的,我只需要启动事件。@GONeale:哇,三年前的评论。那好吧。对,这个,那个有有效的用途,;这就是API首先存在的原因。然而,它们是极少数的。根据我的经验,许多人这样做是因为他们并不真正了解解决问题的最佳方法,即“我想调用我的按钮单击事件处理程序中的代码,但不仅仅是在单击按钮时”。因此,对于初学者来说,模拟一次按钮点击似乎是合乎逻辑的,而他们真正应该做的是将代码放入一个函数中,然后从代码中的其他地方调用它。@EdS:问题很切题。我本可以在创建键盘的过程中添加很多额外的细节,但仍然得到了相同的答案。考虑到我得到了我所需要的,这对我来说似乎不是一个“低质量”的问题。我尝试使用SendKeys。Send,我得到了以下无效操作异常:“SendKeys无法在此应用程序内运行,因为该应用程序未处理Windows消息。更改应用程序以处理消息,或使用SendKeys.SendWait方法。“使用SendKey.SendWait无效。请确保您没有向自己发送密钥事件。在发送事件之前,将焦点切换到正确的流程。第二篇链接文章在这方面有一些帮助。我只是尝试了你的建议,我看没有效果。我已将一个keyDown事件处理程序附加到聚焦元素。我引发的事件已收到,但KeyState为None,扫描代码为0,isDown为false。我假设我得到这些值,因为这是键盘的实际状态。在实际键盘上按一个键,KeyState=Down,isDown=true,ScanCode有一个值。当我尝试第一个keydown代码时,我在“target”中遇到错误,无法将其转换为visual为什么?Dan,你知道如何模拟使用修改器(ctrl/alt/shift)按下键吗?特别是我需要模拟输入绑定:m_shell.InputBindings.Add(newkeybinding(m_命令,Key.Insert,ModifierKeys.Control | ModifierKeys.Alt));关于目标问题,我通过使用
    Keyboard.PrimaryDevice.ActiveSource
    解决了这个问题。这个答案非常好,但它不能用于发送带有修改器的键,正如@Shrike所指出的。(例如,
    Ctrl+C
    )如果您的窗口位于顶部,则为合适。这部分解决了我的问题,谢谢!除了Rajesh的回答之外,如果你想在移动平台上实现这一点,你必须导入“coredll.ddl”,这非常有效,但是我还没有找到如何使用组合键来实现这一点,当你说组合键时,你是指像CTRL-C一样吗?是的,或者即使你想让控制台应用程序全屏运行,例如Alt-Enter,我知道您可以使用F11进入全屏,但如果Alt enter可以工作,那就太好了:)虽然我没有尝试过,但您可以做到,只需使用inputSimulator.Keyboard.ModifiedKeyStroke(VirtualKeyCode.CONTROL,VirtualKeyCode.VK_C);
    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;
    }