Quelle est la meilleure façon d'arrêter l'ordinateur à partir d'un programme C #?
J'ai trouvé quelques méthodes qui fonctionnent - je les posterai ci-dessous - mais aucune d'entre elles n'est très élégante. Je recherche quelque chose de plus simple et nativement .net.
Tiré de: un article de Geekpedia
Cette méthode utilise WMI pour fermer les fenêtres.
Vous devrez ajouter une référence à System.Management à votre projet pour l'utiliser.
la source
Ce fil fournit le code nécessaire: http://bytes.com/forum/thread251367.html
mais voici le code pertinent:
Usage:
ou
la source
Différentes méthodes:
UNE.
System.Diagnostics.Process.Start("Shutdown", "-s -t 10");
B. Instrumentation de gestion Windows (WMI)
C. System.Runtime.InteropServices Pinvoke
D. Gestion du système
Après avoir soumis, j'en ai vu tellement d'autres ont également posté ...
la source
La méthode laide à l'ancienne. Utilisez la
ExitWindowsEx
fonction de l'API Win32.Dans le code de production, vous devriez vérifier les valeurs de retour des appels d'API, mais j'ai laissé cela de côté pour rendre l'exemple plus clair.
la source
Court et doux. Appeler un programme externe:
Remarque: cela appelle le programme Shutdown.exe de Windows, il ne fonctionnera donc que si ce programme est disponible. Vous pouvez rencontrer des problèmes sous Windows 2000 (où shutdown.exe n'est disponible que dans le kit de ressources) ou XP Embedded .
la source
Devrait marcher.
Pour redémarrer, c'est / r
Cela redémarrera la boîte PC directement et proprement, sans aucune boîte de dialogue.
la source
shutdown /s /t 0 //For shutdown
shutdown /r /t 0 //For restart
shutdown /h /t 0 //For hibernate
Essayez également de les saisir dans CMD pour obtenir le même résultat.Vous pouvez lancer le processus d'arrêt:
shutdown -s -t 0
- Fermershutdown -r -t 0
- Redémarrerla source
Notez que ce
shutdown.exe
n'est qu'un wrapper autourInitiateSystemShutdownEx
, qui fournit quelques subtilités manquantes dansExitWindowsEx
la source
J'ai eu du mal à essayer d'utiliser la méthode WMI acceptée ci-dessus parce que j'ai toujours eu des exceptions de privilège non détenues malgré l'exécution du programme en tant qu'administrateur.
La solution était que le processus demande le privilège pour lui-même. J'ai trouvé la réponse sur http://www.dotnet247.com/247reference/msgs/58/292150.aspx écrite par un type appelé Richard Hill.
J'ai collé mon utilisation de base de sa solution ci-dessous au cas où ce lien vieillirait.
la source
Juste pour ajouter à la réponse de Pop Catalin, voici une ligne unique qui arrête l'ordinateur sans afficher de fenêtre:
la source
J'ai essayé la méthode WMI de roomaroo pour arrêter Windows 2003 Server, mais cela ne fonctionnait pas tant que j'aurais ajouté `[STAThread] '(c'est-à-dire le modèle de thread " Single Threaded Apartment ") à la déclaration Main ():
J'ai ensuite essayé de m'arrêter à partir d'un thread, et pour que cela fonctionne, je devais également définir "l'état d'appartement" du thread sur STA:
Je suis un C # noob, donc je ne suis pas entièrement sûr de l'importance des threads STA en termes d'arrêt du système (même après avoir lu le lien que j'ai posté ci-dessus). Peut-être que quelqu'un d'autre peut élaborer ...?
la source
Main()
n'a pas besoin[STAThread]
.** Réponse élaborée ...
la source
Utilisez shutdown.exe. Pour éviter les problèmes de passage d'arguments, d'exécution complexe, d'exécution à partir de WindowForms, utilisez le script d'exécution PowerShell:
System.Management.Automation.dll doit être installé sur le système d'exploitation et disponible dans GAC.
Désolé pour mon anglais.
la source
Il n'y a pas de méthode native .net pour éteindre l'ordinateur. Vous devez P / Invoke l'appel d'API ExitWindows ou ExitWindowsEx.
la source
Si vous souhaitez éteindre l'ordinateur à distance, vous pouvez utiliser
sur n'importe quel bouton, cliquez
la source