如何在调用SendKeys时确保我的应用程序保持焦点?(有没有比使用睡眠更好的方法?)

Eil*_*idh 5 vbscript

我正在更新一些脚本,这些脚本需要将焦点切换到一个应用程序,发送一些击键,然后再将焦点返回到另一个应用程序。

Option Explicit

dim objShell 
set objShell = WScript.CreateObject("WScript.Shell") 

objShell.AppActivate "AnApplication"
WScript.Sleep 1000 

objShell.SendKeys("%{I}")
...
objShell.SendKeys("{END}") 

WScript.Sleep 1000
objShell.AppActivate "AnotherApplication"

Set objShell = Nothing
Run Code Online (Sandbox Code Playgroud)

我研究了对这些脚本的一些改进,而我希望做的一件事就是删除Sleep语句以加快脚本的执行速度。在研究此问题时,我发现建议您AppActivate在继续之前检查返回值,以有效地使脚本等到应用程序获得焦点并可以发送击键之前。

我尝试更新脚本来执行此操作-

Option Explicit

dim objShell 
set objShell = WScript.CreateObject("WScript.Shell")

While Not objShell.AppActivate "AnApplication" 
    Sleep 300
Wend 

objShell.SendKeys("%{I}")
...
objShell.SendKeys("{END}")

While Not objShell.AppActivate "AnotherApplication"
    Sleep 300
Wend 
Run Code Online (Sandbox Code Playgroud)

但是,击键似乎仅在将焦点返回给AnotherApplication之后发送。

有没有一种方法可以确保在发送按键时AnApplication能够获得焦点,而无需使用Sleep?

Bon*_*ond 4

正如我在评论中提到的,没有必要放入AppActivate()循环。这是一个同步调用,该函数在激活窗口(或尝试失败)之前不应返回。

如果您担心窗口失去焦点,可以AppActivate()在发送几次击键后再次调用,也可以在每组击键之前调用它。

例如:

If Not MySendKeys("AnApplication", "%{I}") Then MsgBox "Could not send %{I}"
If Not MySendKeys("AnApplication", "{End}") Then MsgBox "Could not send {End}"

Function MySendKeys(strApp, strKeys)
    If objShell.AppActivate(strApp) Then
        objShell.SendKeys strKeys
        MySendKeys = True
    End If
End Function
Run Code Online (Sandbox Code Playgroud)