SendKeys并不总是工作

我在Excel VBA中使用.SendKeys()将关键笔触发送到使用shell .AppActive方法进行活动的外部窗口。 问题在于, SendKeys行为并不一致,有时会发送密钥,有时不会。 我认为这与根据MSDN文档将密钥存储在缓冲区中有关。

如何解决这个问题?

您可以考虑使用比SendKeys更可靠的Autoit。

从下面的链接下载Autoit http://www.autoitscript.com/site/autoit/downloads/

添加参考AutoIt插件AutoItX3 1.0types库

下面是打开计算器并键入123456789的示例代码

 Sub sendkeys() 'Open a calc StartCalculator Dim au As New AutoItX3Lib.AutoItX3 au.AutoItSetOption "WinTitleMatchMode", 2 au.WinActivate "Calculator" 'send key strokes au.ControlClick "Calculator", "", "Button5" au.ControlClick "Calculator", "", "Button11" au.ControlClick "Calculator", "", "Button16" au.ControlClick "Calculator", "", "Button4" au.ControlClick "Calculator", "", "Button10" au.ControlClick "Calculator", "", "Button15" au.ControlClick "Calculator", "", "Button3" au.ControlClick "Calculator", "", "Button9" au.ControlClick "Calculator", "", "Button14" End Sub Sub StartCalculator() Dim Program As String Dim TaskID As Double On Error Resume Next Program = "calc.exe" TaskID = Shell(Program, 1) If Err <> 0 Then MsgBox "Can't start " & Program End If End Sub 

在这里输入图像说明

我发现这个问题的解决办法是让应用暂停一会儿。 这似乎允许缓冲区清除(纠正我,如果我错了)。

为了使Excel VBA进入hibernate状态,我通过在模块的顶部写入来暴露Windows API函数Sleep

 Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

然后,每个SendKeys命令后,我只是使用:

 Sleep 1 

而从字面上看,1毫秒的差异和密钥总是正确发送。