首先,由于您是初学者,请始终使用Option Explicit
. 许多错误是由变量名中的拼写错误引起的,如果你强迫自己声明你使用的所有变量,你就会发现它们。
其次,您不需要创建两个WScript.Shell
对象,只需重新使用现有的一个。
第三,您需要激活要向其发送命令的应用程序。这就是 Shell 对象的AppActivate
方法的用途。它返回True
or False
,表示将有问题的应用程序带到前台是否有效。您可以在循环 ( While Not Shell.AppActivate("Adobe Reader") ...
) 中使用它来等待应用程序需要的时间。
但是,缺点是您需要知道应用程序窗口的确切标题(或其进程 ID)才能使其正常工作。应用程序标题可能会在没有警告的情况下更改,所以这有点不稳定。PID 是稳健的,但不可猜测。
最后,您将需要 WMI 的帮助来列出所有进程,获取正确的 PID,然后将其传递给AppActivate
. 这Win32_Process
门课就是为此而生的。
Dim Shell, WMI, pid
Set Shell = WScript.CreateObject("WScript.Shell")
Set WMI = GetObject("winmgmts:!\\.\root\cimv2")
Shell.Run "start ""C:\Temp\Gasprices.pdf"""
pid = WaitForProcess("AcroRd32.exe", 5)
If pid > 0 Then
Shell.AppActivate pid
Shell.SendKeys "%FAX%S"
Else
WScript.Echo "Could not talk to PDF reader"
WScript.Quit 1
End If
Function WaitForProcess(imageName, tries)
Dim wql, process
wql = "SELECT ProcessId FROM Win32_Process WHERE Name = '" & imageName & "'"
WaitForProcess = 0
While tries > 0 And WaitForProcess = 0
For Each process In WMI.ExecQuery(wql)
WaitForProcess = process.ProcessId
Next
If WaitForProcess = 0 Then
WScript.Sleep 1000
tries = tries - 1
End If
Wend
End Function
请注意,分配给函数名称(如 中WaitForProcess = 0
)会设置返回值。
您可以通过查找脚本自己的 PID并查询来优化它
"SELECT ProcessId FROM Win32_Process WHERE ParentProcessId = '" & scriptPID & "'"
在WaitForProcess()
.