模拟输入:按下、保持和释放键

5

我想模拟用户按下一个键并保持一段特定的时间间隔,然后再释放它。我尝试使用SendKeys.Send()实现这个功能,但我无法控制按键按下的持续时间。

我不想只是一遍又一遍地发送同一个键;我想要一个单独的按键按下和一个单独的按键释放事件。

例如,我的代码如下:

//when i press this button, will sent keyboard key "A", i want to hold it until i release

private void start_btn_Click(object sender, EventArgs e)
{
    testSent();
}

//how should i hold it for a timer???
private void testSent()
{
    SendKeys.Send("A");
}

抱歉,我不清楚你想做什么。你能展示一些你尝试实现的定时器代码吗?在你的其中一个代码注释中,你说“我想要一直保持它直到我释放”,还有一个注释说“我该如何为定时器保持它???” ,这两个注释不矛盾吗? - Siva Gopal
2个回答

2
如果您想让接收程序仅在按下键后一段时间内看到按键弹起事件,您需要使用不同于“SendKeys”的API。 SendKeys仅发送完整的按键击键,即包含按下和弹起事件。您可能可以通过P / Invoke本机Windows“SendInput()”函数来实现所需功能。
我没有使用过它,但您可能会发现Windows Input Simulator是一个有用的托管代码包装器,可为您提供所需的API。
假设您找出了适当的按键事件的结束方式,按计时执行此操作非常简单:
private static readonly TimeSpan _keyDownInterval = ...; // initialize as desired

private async void start_btn_Click(object sender, EventArgs e)
{
    SendKeyDown();
    await Task.Delay(_keyDownInterval);
    SendKeyUp();
}

// These two are implemented using whatever mechanism you prefer,
// e.g. p/invoke `SendInput()`, using the Windows Input Simulator library, or whatever.
private void SendKeyDown() { ... }
private void SendKeyUp() { ... }

以下是一些与此相关的Stack Overflow问题:
向WPF浏览器控件发送按键
C# p/Invoke如何使用SendInput模拟键盘按下事件以在DirectX游戏中使用
虽然它们都没有具体回答你的问题,但它们都包含了对SendInput()的使用讨论。

当你在实际物理键盘上按住一个键并持续按住它时,它会自动重复直到你松开该键。但是当你使用输入模拟器模拟KeyDown时,该键不会自动重复。为什么?如何让它像物理键一样工作? - RoySeberg
@RoySeberg:当按键被按住时,Windows会明确地重复发送WM_KEYDOWN消息。您需要通过自己发送该输入来模拟这一点,例如使用计时器,以达到所需的持续时间。 - Peter Duniho


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接