当任务栏可用时,Windows 任务计划程序运行任务

当任务栏可用时,Windows 任务计划程序运行任务

我正在尝试创建一个计划事件,该事件将在用户登录时触发。窗口应用程序(以 .NET/C# 编写)在启动时最小化,并在托盘栏中显示一个图标。我现在遇到一个问题,当 Windows 要求激活时,应用程序过早启动。这也破坏了在激活窗口关闭后将应用程序放置在托盘栏中的可能性。我的应用程序在 Windows 按钮方向上最小化,但将显示为带有标题栏的最小化窗口。

窗口最小化

我在安装过程中将该应用程序放入任务计划程序中,因为它需要提升权限才能运行。如何在任务计划程序中创建可靠的触发器以在加载桌面时启动该应用程序?

答案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。

这可能不是最安全的方法,但对我来说,这种方法很管用。欢迎提出意见。

相关内容