Pergunta

Eu estou procurando uma versão inversa do "RunOnceEx".

RunOnceEx faz rodar algum programa, antes de shell do usuário (desktop & taskbar) começar. O progresso de login não vai continuar antes do RunOnceEx completa.

Eu quero fazer exatamente a mesma, mas ao sair usuário. Quando ela / ele sair, todos desligamento programa em execução, deixando shell (desktop e barra de tarefas), então "" Eu desejo que meu programa será executado neste momento "", finalmente sair.

Eu acho que é possível porque o "mobsync.exe" está fazendo isso. Mas eu não consigo encontrar onde e como fazê-lo.

Foi útil?

Solução

Para executar este apenas para o usuário atual, você pode usar o WMI para obter uma informação, quando um desligamento / logout ocorre.

Ou você escrever um pequeno C # (ou qualquer outra linguagem que pode usar WMI) script de aplicação ou vbs para escutar no Win32_ComputerShutdownEvent evento WMI.

Um exemplo C # aplicativo pode ser encontrado aqui nesta questão: Get Log off evento sistema

Outras dicas

Atenção, como disse aqui , gpedit.msc lhe permitirá configurar um script de logoff todas usuários .

Se você precisa que o script só para um usuário, você precisa declará-la diretamente no registro, tanto em HKCU e HKLM.

encontrada no primeiro resultado no Google para me

Para executar um programa que você pode criar um script para executá-lo e usar política de grupo para aplicá-la. Em Group Policy Editor navegue até Configuração do usuário -> Configurações do Windows -> Scripts (Logon / Logoff)

mais informações aqui

Se você quiser um programa em execução para executar código no fim de sessão, então você deve ligar a mensagem WM_QUERYENDSESSION e olhar para um valor lParam de ENDSESSION_LOGOFF (0x80000000).

É importante teste para este valor lParam porque os outros indicam uma "estreita forçada" - ou seja, o processo pode ser morto antes de seu código é ainda permitido para executar. Na verdade, a maioria das mensagens desligamento / sessão-end são destinados apenas para dar-lhe uma oportunidade para executar código de limpeza de última hora e que não são seguros para responder com acções de longa duração; mas esta combinação específica deve ser OK.

Nota: Eu nunca tentei realmente executar um processo separado em resposta à mensagem WM_QUERYENDSESSION. É possível que o gerenciador de janelas não permitirá isso, como ele faz durante o encerramento. Experimente e veja, eu acho.

Se você estiver em um ambiente .NET (você não especificou), uma maneira mais rápida é adicionar um manipulador de eventos para o evento Microsoft.Win32.SystemEvents.SessionEnding.

O que você precisa é uma implementação do GINA . Você pode executar seus comandos personalizados em WlxIsLogoffOk função, que é chamada quando o usuário inicie um logoff

Depois de criar o GINA adequada dll você pode registrá-lo aqui: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\@GinaDLL

Aqui é uma implementação que podem atender às suas necessidades (que fornece uma chave de registro Logoff, onde você pode especificar o seu comando): http://wwwthep.physik.uni-mainz.de/~ frink / newgina_pre09 / readme.html

Como VonC e TFD já foi mencionado, o Group Policy Editor é apenas outra maneira de manipular o registro.

apenas fazer com gpedit as alterações (em UserConfig - Configurações do Windows - Scripts) que você gosta e depois dar uma olhada no registro em [HKEY_CURRENT_USER\Software\Policies\Microsoft\Windows\System\Scripts] para descobrir como você pode fazer isso diretamente.

Também no meu PC (pendurado em um domínio) é um C:\WINDOWS\System32\GroupPolicy pasta escondida com subpastas para o usuário ea máquina. Ambos com subpastas adicionais chamado desligamento e inicialização. Talvez você também pode usar estes.

Se você precisa de algo simples e trabalhar para um único usuário (ou qualquer), você pode fazer uma aplicação simples em C ++ ou C #, por exemplo.

O mais simples é ter um C # na bandeja (simplesmente adicionando o componente de bandeja para o formulário) e registrar e manipulador de eventos para o FormClosing evento. Ele ficaria assim:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason != CloseReason.UserClosing)
        {
            // It's not the user closing the application,
            // Let's do whatever you want here, for example starting a process
            Process notePad = new Process();

            notePad.StartInfo.FileName   = "notepad.exe";
            notePad.StartInfo.Arguments = "ProcessStart.cs";

            notePad.Start();
        }
    }

Assim, a sua aplicação será iniciada com o Windows ou com o usuário. Ele vai esperar (usando um pouco de memória) e vai fazer alguma coisa quando os fecha sistema para baixo, ou o usuário fizer logoff, etc (marcando "CloseReason" acima).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top