Como executar o meu programa antes de logout no Windows XP?
-
11-07-2019 - |
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.
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)
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).