AppActivate Method参考:
激活应用程序窗口。
- 语法:
object.AppActivate title
- 参数:
-
对象:
WshShell 对象。
-
title:指定要激活的应用程序。这可以是一个字符串,其中包含应用程序的标题(它出现在
标题栏)或应用程序的进程 ID。
确保提供给objShell.AppActivate 的字符串是Program.exe 的所需实例 的标题,或者是进程ID。
除了参考SendKeys Method,请阅读Sending Keystrokes to a Program。本文解释了 your any 脚本的根本不足 - 时间问题:
您应该知道,向应用程序发送击键不是
自动化程序的最佳方法。如果你有一个
您的企业中需要自动化的应用程序,它没有
基于 COM 的对象模型,您可能会考虑这种技术。然而,
您应该首先检查是否存在其他方法进行自动化
那个特定的应用程序。
虽然SendKeys可以有效地使用,但有几个潜力
这种方法的问题:
- 脚本可能难以确定将击键发送到哪个窗口。
- 由于应用程序在 GUI 模式下运行,用户可能会提前关闭应用程序。不幸的是,这不会终止
脚本,并且脚本最终可能会将击键发送到错误的
应用程序。
-
脚本可能难以与应用程序同步。
这个计时问题特别麻烦,只是因为脚本
运行速度往往比 GUI 应用程序快得多。
…
和使用AppActivate:
在向应用程序发送击键之前,您必须首先确保
应用程序正在运行并且焦点位于
应用程序(即应用程序运行在活动
窗户)。
...
您可以定期将脚本置于循环中
调用 AppActivate 直到返回值为 True。那时,
应用程序已加载并准备接受击键。
…
什么时候
该脚本正在确定要激活哪个应用程序,给定的
标题与屏幕上可见的每个窗口的标题进行比较。 如果
不存在完全匹配,AppActivate 方法将焦点设置为
标题以给定文本开头的第一个窗口。如果一个窗口
仍然找不到,标题字符串以结尾的第一个窗口
文本被赋予焦点。与前导和部分匹配
标题栏的尾随文本确保 AppActivate 与
显示当前名称的应用程序,例如记事本
标题栏上打开的文档。 (例如,当您第一次开始
Notepad,窗口标题是Untitled - Notepad,而不是Notepad。)
…
(以上引用仅是我重点的摘要:太长,无法在此处引用整篇文章。)
编辑。
让我们正视SendKeys 方法将击键发送到活动窗口sight unseen,因为实际上我们从来没有知道当前焦点所在的窗口。利用Run Method (Windows Script Host) 完整语法objShell.Run sCmdLine, 1, False 其中窗口样式1 的含义是
-
1 激活并显示一个窗口。如果窗口被最小化或最大化,系统会将其恢复为原始大小并
位置。应用程序应该在显示时指定此标志
第一次打开窗户。
使用下一个示例脚本进行测试(为更好理解而添加注释):
option explicit
On Error GoTo 0
Dim objShell, sProgram, sTxtFile, sTxtPath, sCmdLine, sTxtExists
Set objShell = WScript.CreateObject( "WScript.Shell" )
sProgram = "C:\Windows\System32\notepad.exe"
sTxtFile = Replace( Wscript.ScriptName, ".vbs", ".txt", 1, -1, vbTextCompare)
sTxtPath = CreateObject("Scripting.FileSystemObject").BuildPath( _
objShell.ExpandEnvironmentStrings("%temp%"), sTxtFile)
sTxtExists = CreateObject("Scripting.FileSystemObject").FileExists(sTxtPath)
' delete file merely for testing and debugging to ensure that
' `NOTEPAD` will ask whether create nonexistent file
If sTxtExists Then CreateObject("Scripting.FileSystemObject").DeleteFile( sTxtPath)
WScript.Sleep 500 ' wait for deleting
sCmdLine = """" & sProgram & """ """ & sTxtPath & """"
objShell.Run sCmdLine, 1, False
' this `1` activates currently launched notepad
' and its possible initial dialogue takes focus
WScript.Sleep 1000 ' hence, `AppActivate` is not necessary
' alternative to `DeleteFile( sTxtPath)`
' If NOT sTxtExists Then ' answer initial dialogue only if necessary
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{TAB}"
WScript.Sleep 100
objShell.SendKeys "{ENTER}"
WScript.Sleep 100
' End If
objShell.SendKeys Cstr(Now)
WScript.Sleep 100
但是,您的启动器中还有另一个 timing 和 focus 问题。 Python time.sleep(2) 就足够了吗?当然不是:每个 vbs 脚本在第一个 SendKeys 之前等待 3 秒,但下一个脚本每 2 秒启动一次!
等效的批处理脚本:Timeout command 将命令处理器暂停指定的秒数。
尾随1>NUL hides output倒计时Waiting for X seconds, press CTRL+C to quit ...
for /r "." %%a in (*.vbs) do (
C:\Windows\System32\wscript.exe "%%~fa"
timeout /T 5 /NOBREAK 1>NUL
)
5 秒就够了吗?