Laden...

Shutdown: Windows und alle Prozesse ohne "Ungesicherte Daten speichern?"-Dialoge herunterfahren

Erstellt von seek vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.023 Views
S
seek Themenstarter:in
22 Beiträge seit 2009
vor 12 Jahren
Shutdown: Windows und alle Prozesse ohne "Ungesicherte Daten speichern?"-Dialoge herunterfahren

Hallo,

ich erstelle in WPF ein kleines Shutdown Gadget und bin jedoch auf folgendes Problem gestoßen:
Shutdown wird ausgeführt jedoch wenn etwas offen ist wie Word wird dieser verhindert. Es geht dann das typische Windows 7 Fenster auf wo man das "Herunterfahren erzwingen" kann.

Dieses Problem wollte ich umgehen indem ich alle Prozesse vorher mit

System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();

in einem Array lade und dann jedes einzelne beende. Jedoch löst das bei Windows 7 ein Bluescreen aus – denke es wird irgendein wichtiger System Prozess beendet. Hab leider im Netz nicht finden können wie man nur die Prozesse öffnet die im Taskmanager in der ersten Registerkarte "Anwendungen" zu finden sind.

Dort sind meistens nur diese die nach dem Hochfahren gestartet wurden z.B: Word, Notepad, Windows Mediaplayer etz. Durch das Beenden dieser Speziellen Programme würde auch kein System Prozess beendet und es gäbe auch kein Bluescreen.

Eine Alternative wäre es wenn das Programm automatisch den Button "Herunterfahren erzwingen" betätigen könnte. Hab dazu auch nix gefunden ohne die Maus speziell wo klicken zu lassen. Und den Prozess finden übernehmen und das Button bestätigen ist für so ein Gadget auch zu viel des guten bzw. auch nicht sehr effizient.

Hoffe mir kann wer weiterhelfen ?(

mfg
Seek

A
118 Beiträge seit 2009
vor 12 Jahren

Versuch mal:


var processes = from p in Process.GetProcesses() where p.MainWindowTitle.Length > 0 select p;

Mfg
Aratar

S
seek Themenstarter:in
22 Beiträge seit 2009
vor 12 Jahren

Danke Aratar,

hat super funktioniert kein Bluescreen mehr 😁

Bin aber leider wieder bei meinem alten Problem. Wenn ich Word mit

if (!(processChild.MainWindowTitle.Equals(this.Text)) && processChild.MainWindowTitle.Length > 0)
{
	processChild.Kill();
}

beende dann fragt Word immer noch nach ob das Dokument abgespeichert werden soll. Das Program wird leider nicht beendet.

Gibt es da was Besseres wenn man übern Taskmanager den Prozess Winword.exe direkt beendet dann fragt er nicht mehr nach. Dachte das macht das Kill() auch?

mfg
Seek

5.742 Beiträge seit 2007
vor 12 Jahren

beende dann fragt Word immer noch nach ob das Dokument abgespeichert werden soll. Das Program wird leider nicht beendet.

Das ist doch auch gut so - wenn der User noch ungespeicherte Änderungen hat, möchte er diese im Normalfall auch nicht verlieren.

S
seek Themenstarter:in
22 Beiträge seit 2009
vor 12 Jahren

Danke winSharp63 ich weiß das die ein Schutz eingebaut haben und auch wofür der gut ist 🙂
Ich möchte aber das alles verloren geht wenn das Gadget Windows runterfährt. Wenn ich das nicht wollen würde, würde ich nicht extra hier nachfragen 😁

Also weiß wer wie man per c# Code ein Programm beenden kann so wie als würde man dieses über den Taskmanager beenden? Wenn man WinWord.exe über den Taskmanager beendet umgeht das diesen Schutzmechanismus.

Danke.

mfg
Seek

1.346 Beiträge seit 2008
vor 12 Jahren

Auch wenn mir jetzt nichts einfällt, wo soetwas nützlich ist, kann man den parameter -f (force) als Parameter an den shoutdown befehl anhängen

S
seek Themenstarter:in
22 Beiträge seit 2009
vor 12 Jahren

Habe das mit Shutdown schon versucht gleiches Problem, habe deshalb ne Programm interne Shutdown Funktion von Codeguru übernommen.

Ich brauche das weil ich am Abend übern Laptop immer Video schaue (VGA auf Fernseher) und wir schlafen manchmal ein 😃. Weil shutdown -t (ZeitinSekunden) -f auch nicht funktioniert will ich etwas das alles beendet und den PC herunterfahrt. Mir egal ob noch was offen ist - Pech gehabt ^^

mfg,
seek

5.742 Beiträge seit 2007
vor 12 Jahren

Du könntest dir mal

taskkill.exe

anschauen - damit ist dann wirklich Schluss 😉

H
31 Beiträge seit 2010
vor 12 Jahren

Servus,

womit es gehen müsste ist die WMI. Da gibt es extra einen Parameter zum erzwingen des Neustarts.

option explicit

if msgbox("Do you want to shut down this computer?", 4, "System Shutdown") = 6 then
	dim osObj, osColl 
	const nLogOff=0 
	const nReboot=2 
	const nForceLogOff=4 
	const nForceReboot=6 
	const nPowerDown=8 
	const nForcePowerDown=12 

	Set osColl = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem") 

	For Each osObj in osColl
	    osObj.Win32Shutdown(nForcePowerDown)
	Next
else
	msgBox "Shutdown cancelled",vbOKOnly+vbInformation,"System Shutdown"
end if

Das Beispiel lässt sich natürlich auch in C# übertragen.
Win32_OperatingSystem gibt es, wenn du mal einen Blick riskierst, auch eine Methode zum angeben eines Grundes. (Windows Server)

Viele Grüße

Hotte