答案1
在启动时触发此批处理脚本。它等待 explorer.exe 启动(任务栏已在其中实现)然后启动应用程序:
:waitingfortaskbar
tasklist /FI "IMAGENAME eq explorer.exe" 2>nul | find /I /N "explorer.exe">nul
if "%ERRORLEVEL%"=="0" goto startapp
goto waitingfortaskbar
:startapp
REM ping localhost -n 1 -w 10> nul
start DriverLetter:\...MyProgramLocation...\MyProgram.exe -myArguments
exit
如果您想要延迟任务,只需删除毫秒REM
并将其替换10
为您想要的毫秒;如果任务栏没有像它应该的那样在 explorer.exe 之后立即设置,您可能必须这样做。然后start
用实际文件位置及其参数(如果有)替换该行。
该程序将显示命令提示符,直到 explorer.exe 启动;如果您想让它不可见,请给我留言。我有两个选择。
答案2
我只是想添加另一种基于 El8tedN8te 解决方案的可能性;但是,它是 vb 脚本:
Function ProcessRunning(process)
SET objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")
SET colProcessList = objWMIService.ExecQuery _
("Select Name from Win32_Process WHERE Name LIKE '" & process & "%'")
IF colProcessList.count>0 THEN
ProcessRunning = 1
ELSE
ProcessRunning = 0
END IF
SET objWMIService = Nothing
SET colProcessList = Nothing
End Function
' Check if the task is already running
taskRunning = ProcessRunning("{taskFilename}")
IF taskRunning THEN
WScript.Quit 0
END IF
' Check if required task is already running
requiredTaskRunning = ProcessRunning("explorer.exe")
DO WHILE requiredTaskRunning = 0
WScript.Sleep 5000
requiredTaskRunning = ProcessRunning("explorer.exe")
LOOP
DIM oShell
SET oShell = WScript.CreateObject ("WScript.Shell")
oShell.run """{taskDirectory}{taskFilename}"" {taskArguments}", 1
SET oShell = Nothing
vbs 脚本引擎在运行时不显示任何窗口。因此,我不必担心隐藏 bat/cmd 窗口。大括号之间的文本在运行时被我的应用程序替换,然后保存为 .vbs 文件。然后,安排一个任务以提升的权限运行 vbs。
这可能不是最安全的方法,但对我来说,这种方法很管用。欢迎提出意见。