AppActivate 方法参考:
激活应用程序窗口。
- 句法:
object.AppActivate title
- 论据:
- 对象:
WshShell
对象。
- title:指定要激活的应用程序。这可以是一个字符串,其中包含应用程序的标题(在标题栏中显示)或应用程序的进程 ID。
确保提供给的字符串objShell.AppActivate
是所需实例的标题Program.exe
或其Process ID。
除了SendKeys 方法参考,请阅读将击键发送到程序。本文解释了您的 任何脚本的根本不足 - 时间问题:
您应该知道,将击键发送到应用程序并不是自动化过程的最佳方法。如果您的企业中有一个需要自动化的应用程序并且它没有基于 COM 的对象模型,那么您可能会考虑这种技术。但是,您应该首先检查是否存在用于自动化该特定应用程序的其他方法。
虽然SendKeys
可以有效地使用,但这种方法存在几个潜在问题:
- 该脚本可能难以确定将击键发送到哪个窗口。
- 由于应用程序在 GUI 模式下运行,用户可能会过早关闭应用程序。不幸的是,这不会终止脚本,并且脚本最终可能会将击键发送到错误的应用程序。
- 该脚本可能难以与应用程序同步。
这个计时问题特别麻烦,因为脚本往往比 GUI 应用程序运行得快得多。
…</p>
并使用AppActivate
:
在向应用程序发送击键之前,您必须首先确保应用程序正在运行并且焦点在应用程序上(即应用程序正在活动窗口中运行)。
…
您可以将您的脚本放在一个循环中,定期调用 AppActivate 直到返回值为 True。此时,应用程序已加载并准备好接受击键。
…<BR>当脚本决定激活哪个应用程序时,给定的标题会与屏幕上可见的每个窗口的标题进行比较。如果不存在完全匹配,则该AppActivate
方法将焦点设置到标题以给定文本开头的第一个窗口. 如果仍然找不到窗口,则标题字符串以文本结尾的第一个窗口将获得焦点。与标题栏的前导和尾随文本的部分匹配确保了AppActivate
适用于在标题栏上显示当前打开的文档名称的应用程序,例如记事本。(例如,当您第一次启动时
Notepad
,窗口标题是Untitled - Notepad
,而不是Notepad
。)
...<BR>
(以上引用仅是我强调的摘要:太长,无法在此处引用整篇文章。)
编辑.
让我们正视该SendKeys
方法将击键发送到看不见的活动窗口视线,因为实际上我们永远不知道当前聚焦哪个窗口。利用运行方法(Windows 脚本宿主)的完整语法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
但是,您的启动器中还有另一个时间和焦点问题。Pythontime.sleep(2)
就足够了吗?当然不是:每个vbs
脚本在第一个脚本之前等待 3 秒,SendKeys
但下一个脚本每 2 秒启动一次!
等效的批处理脚本:Timeout
命令将命令处理器暂停指定的秒数。
尾随1>NUL
隐藏输出倒计时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秒就够了吗?