Qual é a melhor maneira de desligar o computador a partir de um programa C #?
Encontrei alguns métodos que funcionam - eu os publicarei abaixo - mas nenhum deles é muito elegante. Estou procurando por algo que seja mais simples e nativamente .net.
Funciona a partir do Windows XP, não disponível no Windows 2000 ou inferior:
Esta é a maneira mais rápida de fazer isso:
Process.Start("shutdown","/s /t 0");
Caso contrário, use P / Invoke ou WMI como outros disseram.
Editar: como evitar a criação de uma janela
var psi = new ProcessStartInfo("shutdown","/s /t 0");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
Process.Start(psi);
Retirado de: a Geekpedia post
Este método usa o WMI para desligar as janelas.
Você precisará adicionar uma referência ao System.Management ao seu projeto para usá-lo.
fonte
Este tópico fornece o código necessário: http://bytes.com/forum/thread251367.html
mas aqui está o código relevante:
Uso:
ou
fonte
Métodos diferentes:
UMA.
System.Diagnostics.Process.Start("Shutdown", "-s -t 10");
B. Instrumentação de Gerenciamento do Windows (WMI)
C. System.Runtime.InteropServices Pinvoke
D. Gerenciamento do Sistema
Depois de enviar, vi muitos outros também postarem ...
fonte
O método feio da velha escola. Use a
ExitWindowsEx
função da API do Win32.No código de produção, você deve verificar os valores de retorno das chamadas de API, mas deixei isso de fora para tornar o exemplo mais claro.
fonte
Curto e grosso. Ligue para um programa externo:
Nota: Isso chama o programa Shutdown.exe do Windows, portanto só funcionará se esse programa estiver disponível. Você pode ter problemas no Windows 2000 (onde shutdown.exe está disponível apenas no kit de recursos) ou no XP Embedded .
fonte
Deveria trabalhar.
Para reiniciar, é / r
Isso reiniciará a caixa do PC de maneira direta e limpa, sem caixas de diálogo.
fonte
shutdown /s /t 0 //For shutdown
shutdown /r /t 0 //For restart
shutdown /h /t 0 //For hibernate
Além disso, tente digitá-las no CMD para o mesmo resultado.Você pode iniciar o processo de desligamento:
shutdown -s -t 0
- Desligarshutdown -r -t 0
- Reiniciarfonte
Observe que
shutdown.exe
é apenas um invólucroInitiateSystemShutdownEx
, que fornece alguns detalhes ausentes noExitWindowsEx
fonte
Tive problemas ao tentar usar o método WMI aceito acima, porque sempre obtive o privilégio de não ter exceções, apesar de executar o programa como administrador.
A solução foi o processo solicitar o privilégio para si. Encontrei a resposta em http://www.dotnet247.com/247reference/msgs/58/292150.aspx escrita por um cara chamado Richard Hill.
Eu colei meu uso básico da solução abaixo, caso o link fique velho.
fonte
Apenas para adicionar à resposta do Pop Catalin, aqui está um liner que desliga o computador sem exibir nenhuma janela:
fonte
Tentei o método WMI do roomaroo para desligar o Windows 2003 Server, mas ele não funcionaria até que eu adicionasse `[STAThread] '(ou seja, o modelo de encadeamento " Single Threaded Apartment ") à declaração Main ():
Tentei desligar a partir de um thread e, para que isso funcionasse, tive que definir o "Estado do apartamento" do thread como STA:
Eu sou um C # noob, por isso não tenho certeza do significado dos threads STA em termos de desligamento do sistema (mesmo depois de ler o link que eu postei acima). Talvez alguém mais possa elaborar ...?
fonte
Main()
não precisa[STAThread]
.** Resposta elaborada ...
fonte
Use shutdown.exe. Para evitar problemas com a passagem de argumentos, execução complexa, execução de WindowForms, use o script de execução do PowerShell:
O System.Management.Automation.dll deve estar instalado no sistema operacional e disponível no GAC.
Desculpe pelo meu Inglês.
fonte
Não existe um método nativo .net para desligar o computador. Você precisa P / Invocar a chamada da API ExitWindows ou ExitWindowsEx API.
fonte
Se você deseja desligar o computador remotamente, poderá usar
em qualquer botão, clique
fonte