Tarefa do Agendador de Tarefas do Windows quando a Barra de Tarefas está disponível

0

Estou tentando criar um evento programado que será disparado quando um usuário fizer logon. O aplicativo de janela (escrito em .NET / C #) está sendo minimizado com um ícone na barra de ferramentas. Eu agora encontrei um problema quando o Windows está pedindo a ativação, o aplicativo é iniciado prematuramente. Isso também interrompe a possibilidade de o aplicativo ser colocado na Barra de Trajetória após a janela de ativação ser fechada. Minha aplicação minimiza na direção do botão do Windows, mas será mostrada como uma janela minimizada com a Barra de Título.

Eu coloquei o aplicativo no Agendador de Tarefas durante um processo de instalação porque ele exige direitos elevados para ser executado. Como posso criar um Trigger confiável no Agendador de Tarefas para iniciar o aplicativo quando a área de trabalho é carregada?

    
por Alexander Fuchs 02.08.2017 / 07:56

2 respostas

1

Acione este script em lote na inicialização. Ele aguarda o início do explorer.exe (no qual a barra de tarefas é implementada) e, em seguida, inicia o aplicativo:

: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

Se você quiser, atrase a tarefa, apenas remova REM e substitua 10 milissegundos por milissegundos desejados. Você pode ter que fazer isso se a barra de tarefas não for configurada instantaneamente após o explorer.exe como deveria. Em seguida, substitua a linha start pela localização real do arquivo e seus argumentos (se houver).

O programa mostrará o prompt de comando até que o explorer.exe seja iniciado; Se você quiser torná-lo invisível, basta me comentar. Eu tenho duas opções em mente.

    
por 02.08.2017 / 10:41
1

Eu só quero adicionar outra possibilidade que funcione com base na solução do El8tedN8te; no entanto, é vb script:

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

O mecanismo de script vbs não mostra nenhuma janela enquanto está sendo executado. Portanto, não preciso se preocupar em ocultar a janela bat / cmd. O texto entre os parênteses é substituído pelo meu aplicativo em tempo de execução e salvo como um arquivo .vbs. Em seguida, uma tarefa está agendada para executar o vbs com direitos elevados.

Esta provavelmente não é a maneira mais segura de fazê-lo, mas isso foi o suficiente para mim. Comentários ainda são bem vindos.

    
por 02.08.2017 / 16:13