Я пытаюсь создать запланированное событие, которое будет срабатывать при входе пользователя в систему. Оконное приложение (написанное на .NET/C #) запускается свернутым со значком на панели задач. Теперь я столкнулся с проблемой, когда Windows запрашивает активацию, приложение запускается преждевременно. Это также нарушает возможность размещения приложения на панели задач после закрытия окна активации. Мое приложение сворачивается в направлении кнопки Windows, но будет отображаться в виде свернутого окна с Titlebar.

Окно свернуто

Я поместил приложение в планировщик задач во время процесса установки, поскольку для его запуска требуются повышенные права. Как создать надежный триггер в планировщике задач для запуска приложения при загрузке рабочего стола?

2 ответа2

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; Если вы хотите сделать это невидимым, просто прокомментируйте меня. Я имею в виду два варианта.

1

Я просто хочу добавить еще одну возможность, которая работает на основе решения от 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 с повышенными правами.

Вероятно, это не самый безопасный способ сделать это, но это помогло мне. Комментарии все еще приветствуются.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .