我正在更新一些脚本,这些脚本需要将焦点切换到一个应用程序,发送一些击键,然后再将焦点返回到另一个应用程序。
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?
正如我在评论中提到的,没有必要放入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)
| 归档时间: |
|
| 查看次数: |
9228 次 |
| 最近记录: |