如何使用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设置: KeyboardDelay
和KeyboardSpeed
。 后者可从Windows窗体( SystemInformation.KeyboardDelay
, SystemInformation.KeyboardSpeed
)访问。
使用前面提到的输入模拟器库,我实现了一种模拟实际行为的密钥保存方法。 这是await/async
准备,并支持取消。
static Task SimulateKeyHold(VirtualKeyCode key, int holdDurationMs, int repeatDelayMs, int repeatRateMs, CancellationToken token) { var tcs = new TaskCompletionSource
您可以使用SendInput或keyb_event,两者都是本机API函数。 SendInput比keybd_event有一些优势,但SendInput只能从XP开始使用。
这是msdn链接http://msdn.microsoft.com/en-us/library/ms646310.aspx
希望这可以帮助
我曾经想在powerpoint上做同样的事情,隐藏光标,然后停止幻灯片放映。 但是由于powerpoint中出现了许多顶级窗口,所以它很难也很棘手,如果它不起作用,很难弄清楚哪个部分的仿真失败了。 在使用Spy ++查看消息队列之后,我注意到在按键之后发送了加速器命令,所以相反,我模仿了加速器命令,它就像魅力一样。 所以你可能想要研究这样的替代方案。