如何使用C#推送密钥并将其释放?

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

SendKeys通过按住并立即释放它来“按下”一个键。 我想按下它并随意释放它。

我的问题是:“有没有办法向键发送”推“信号,然后在一定时间后发出”释放“信号?”

我不确定SendKeys是否能够做到这一点。 任何线索?

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

keybd_event的MSDN在这里: 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(); 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函数。 SendInput比keybd_event有一些优势,但SendInput只能从XP开始使用。

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

希望这可以帮助

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