如何使用 C# 推送密钥并释放它

本文关键字:释放 密钥 何使用 | 更新日期: 2023-09-27 17:47:21

我正在编写一个C#程序,该程序从外部设备捕获信号,并将击键发送到另一个应用程序。我正在使用发送密钥,它工作正常。

发送键通过按住并立即释放键来"按下"它。我想让它按下键并随意释放它。

我的问题是:"有没有办法向密钥发送"推送"信号,然后在一定时间后发送"释放"信号?

我不确定发送密钥是否能够做到这一点。有什么线索吗?

如何使用 C# 推送密钥并释放它

我认为直接从 .NET 是不可能的您可以尝试通过 p/调用函数来使用本机调用keybd_event如下所述:http://pinvoke.net/default.aspx/user32.keybd_event

MSDN for keybd_event 位于此处:http://msdn.microsoft.com/en-us/library/ms646304(VS.85).aspx

希望对您有所帮助!

接受的答案使用已弃用的keybd_event。官方 API 现已SendInput .在 http://inputsimulator.codeplex.com 还有一个很好的包装器。

然而,以上都不能完全迎合"关键持有"的情况。这是因为持有密钥将生成多个WM_KEYDOWN消息,然后在发布时生成单个WM_KEYUP消息(您可以使用 Spy++ 检查这一点)。

WM_KEYDOWN消息的频率取决于硬件,BIOS设置和几个Windows设置:KeyboardDelayKeyboardSpeed 。后者可以从Windows窗体(SystemInformation.KeyboardDelaySystemInformation.KeyboardSpeed)访问。

使用前面提到的输入模拟器库,我实现了模拟实际行为的键保持方法。它已await/async就绪,并支持取消。

static Task SimulateKeyHold(VirtualKeyCode key, int holdDurationMs, 
                            int repeatDelayMs, int repeatRateMs, CancellationToken token)
{
    var tcs = new TaskCompletionSource<object>();
    var ctr = new CancellationTokenRegistration();
    var startCount = Environment.TickCount;
    Timer timer = null;
    timer = new Timer(s =>         
    {
        lock (timer)
        {
            if (Environment.TickCount - startCount <= holdDurationMs)
                InputSimulator.SimulateKeyDown(key);
            else if (startCount != -1)
            { 
                startCount = -1; 
                timer.Dispose();
                ctr.Dispose();                    
                InputSimulator.SimulateKeyUp(key);
                tcs.TrySetResult(null);
            }
        }
    });
    timer.Change(repeatDelayMs, repeatRateMs);
    if (token.CanBeCanceled)
        ctr = token.Register(() =>
                       {
                           timer.Dispose();
                           tcs.TrySetCanceled();
                       });
    return tcs.Task;
}
您可以使用

SendInput或keyb_event,两者都是本机API函数。与keybd_event相比,SendInput 有一些优势,但 SendInput 只能从 XP 开始使用。

这是 msdn 链接http://msdn.microsoft.com/en-us/library/ms646310.aspx

希望这有帮助

我曾经想在PowerPoint上做同样的事情,隐藏光标,然后停止幻灯片放映。但这既困难又棘手,因为PowerPoint中出现了许多顶级窗口,如果它不起作用,也很难弄清楚仿真的哪一部分失败了。使用 Spy++ 查看消息队列后,我注意到加速器命令是在按键后发送的,因此,我模拟了加速器命令,它的工作方式就像魅力一样。因此,您可能想研究这样的替代方案。