如何在 VBScript 中让命令窗口最小化运行?
可以通过现有的 VBScript 接口请求窗口最小化,无需另装程序。WScript.Shell.Run 用第二个参数设置窗口样式,Shell.Application.ShellExecute 则用第五个参数设置窗口显示方式,因此第二段应改为:
app.ShellExecute "C:\Users\123\Batch Files\Scripts\Keystroke - Enter.ahk", , , "runas", 2
这里的 2 表示以最小化方式显示。这个设置只向所启动的程序提出显示请求,不能保证它随后创建的所有窗口也保持最小化。
为什么同样的参数不能放在同一位置
这两个方法的参数顺序如下:
Run(strCommand, [intWindowStyle], [bWaitOnReturn])
ShellExecute(sFile, [vArguments], [vDirectory], [vOperation], [vShow])
Run 的第二个参数是窗口样式;ShellExecute 的第二个参数是传给目标程序的命令行参数,窗口显示方式要放在第五个位置。
所以,第二、第三个参数留空,第四个参数保留 "runas",第五个参数填入 2。"runas" 用于请求以管理员身份运行,与窗口是否最小化是两项独立的设置。
完整代码
按原有流程,先启动批处理,再启动用于确认的 AHK 脚本:
Set objShell = WScript.CreateObject("WScript.Shell")
objShell.Run """D:\Resources\ABC\__Randomise.bat""", 2, False
Set app = CreateObject("Shell.Application")
app.ShellExecute "C:\Users\123\Batch Files\Scripts\Keystroke - Enter.ahk", , , "runas", 2
Set app = Nothing
Set objShell = Nothing
第一条调用中的三重双引号用于在传给 Run 的命令字符串中保留路径两侧的双引号。ShellExecute 接收单独的文件路径参数,即使路径包含空格,也不需要采用这种写法。
Run 的第三个参数设为 False,表示启动批处理后继续执行 VBScript,让后面的 AHK 脚本能够运行。如果改成 True,VBScript 会等待批处理退出,而批处理又在等待确认,后面的 AHK 调用就无法及时执行。False 也是该参数的默认值。
原代码第二段末尾的 Set objShell = Nothing 释放的是另一个对象。要释放 Shell.Application 对象,应使用 Set app = Nothing。
最小化后仍需注意的情况
最小化不会自动完成批处理中的确认。如果 AHK 脚本只是向当前活动窗口发送 Enter,批处理窗口最小化后,按键可能会发给其他窗口。需要检查 AHK 是否明确定位了目标窗口,以及所用的发送方式能否对最小化窗口生效。如果脚本先激活或还原目标窗口,窗口也可能重新出现。
AHK 脚本本身通常不会显示命令提示符窗口。如果额外的命令窗口由 AHK 内部调用的 cmd.exe、批处理文件或其他程序创建,就需要在对应的启动调用中设置最小化。外层 ShellExecute 的第五个参数不会自动控制这些后续窗口,目标程序也可能忽略显示请求。
保留 "runas" 时,系统仍可能显示 UAC 提权提示。窗口样式参数 2 无法将这个提示最小化或跳过。
备注:内容仅供参考。
