c# - 模拟输入 : key pressed, 保持和释放

标签 c# keypress sendkeys

我正在尝试模拟用户按下一个键,按住它一段时间特定的时间间隔,然后释放它。我尝试使用 SendKeys.Send() 来实现这一点,但我无法弄清楚如何控制按下按键的持续时间。

我不想一遍又一遍地发送相同的 key ;我想要一个单一的按键事件和一个单一的按键事件。

例如,我有这样的代码:

//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");
}

最佳答案

如果您希望接收程序在一段时间后只看到按下事件和按下事件,您将需要一个不同于 SendKeys 的 API。那个只发送整个击键,即按键按下和按键向上。您可以通过调用 native 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 的一些相关问题:
Send keys to WPF Browser control
C# p/Invoke How to simulate a keyPRESS event using SendInput for DirectX games

两者都没有专门解决您的问题,但它们都包含一些关于 SendInput() 用法的讨论。

关于c# - 模拟输入 : key pressed, 保持和释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793410/

相关文章:

java - Selenium driver.findElement 查找元素,sendKeys 有效,然后在移动到新字段时清空

c# - 为什么 .NET "de-CH"区域性数字组分隔符在本地和 Azure 上不同?

c++ - 如何覆盖/禁用 ncurses 输入?

remote-desktop - 在远程桌面上运行时替代 SendKeys?

javascript - 防止按键事件中输入字段出现空格

javascript - 按 ENTER 后如何重新启动游戏?

c# - SendKeys.Send 并关闭键修饰符

c# - 如何在 XmlNodeList 中添加 XML 节点

c# - IntegratedWindowsAuthentication 与协商有什么区别?

c# - 如何在 ASP.NET Web API 中设置下载文件名