我正在尝试使用ShellExecuteWait()
启动我的相机应用程序(Windows 10)(因为我希望我的脚本等到我关闭相机应用程序)。但我似乎无法让它发挥作用。我尝试使用帮助文件中的代码:
#include <MsgBoxConstants.au3>
Camera()
Func Camera()
;Execute Camera and wait for Camera to close
Local $iReturn = ShellExecuteWait("notepad.exe")
;Display the return value
MsgBox($MB_SYSTEMMODAL, "", "The return code from Notepad was: " & $iReturn)
EndFunc
显示记事本。关闭它时,会出现一个带有返回值的消息框。但是,当我将notepad.exe
更改为explorer.exe
时,ShellExecuteWait()
似乎失败了(并且消息框会立即显示)。
您无法使用Run("camera.exe")
在Windows 10上打开相机;与explorer.exe
一样,此操作失败,消息框会立即显示。
这是我想要的代码:
#include <MsgBoxConstants.au3>
Camera()
Func Camera()
;Execute Camera and wait for Camera to close
Local $iReturn = ShellExecuteWait("explorer.exe", "shell:AppsFolder\Microsoft.WindowsCamera_8wekyb3d8bbwe!App")
;Display the return value
MsgBox($MB_SYSTEMMODAL, "", "The return code from Notepad was: " & $iReturn)
EndFunc
答案 0 :(得分:1)
ShellExecuteWait()
可能无法正常工作。 explorer.exe
始终在运行。对它的另一个调用只会告诉已经运行的explorer.exe
显示一个额外的窗口(就像许多浏览器不会创建自己的另一个实例而只是一个新选项卡)。您可以使用 ProcessExplorer (来自 Sysinternals Suite )等工具检查当前流程层次结构。在那里你可以看到,记事本实际上是你的自动脚本的一个子流程,其中explorer.exe
仍然是svhost.exe
的孩子。
你仍然可以尝试这样的事情:
#include <MsgBoxConstants.au3>
Camera()
Func Camera()
;Execute Camera and wait for Camera to close
local $iPID = ShellExecuteWait("explorer.exe", "shell:AppsFolder\Microsoft.WindowsCamera_8wekyb3d8bbwe!App")
Sleep(3000)
WinWaitClose("Camera")
;Display the return value
MsgBox($MB_SYSTEMMODAL, "", "The Camera was closed." )
EndFunc
有了这个,你的脚本会等到没有更多的窗口被调用&#34; Camera&#34;存在。请注意,结果将取决于操作系统语言(例如,对于我来说,&#34; Kamera&#34;)。您可以使用工具 AutoIt窗口信息来查找与语言无关的特征。