Windows: "Computer ausschalten"-Dialog

Alles, was nicht direkt mit Python-Problemen zu tun hat. Dies ist auch der perfekte Platz für Jobangebote.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Ich suche derzeit eine einfache Möglichkeit, ein Backup-Programm vor dem Ausschalten des Computers laufen zu lassen.

Weiß jemand, welches Programm ausgeführt wird, wenn man im Startmenü auf den Eintrag "Computer ausschalten..." klickt?

Oder gibt es eine andere Möglichkeit, ein Programm vor dem Aufruf des "Computer ausschalten"-Dialogs ausführen zu lassen?

Mein Ziel ist es, immer dann, wenn der Benutzer den Computer herunterfahren möchte, diesem einen Dialog zu präsentieren, der zu einem Backup auffordert. Wird "OK" geklickt, dann soll zuerst das Backup erstellt und danach der Computer herunter gefahren werden. Wird auf "Abbrechen" geklickt, dann wird der Dialog geschlossen und der "Computer ausschalten"-Dialog wird aufgerufen. -- So der Plan.

Ich wäre für jeden Hinweis dankbar.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hi gerold. Man koennte die Windows-Message von einem Daemon abfangen lassen, der dann den Backup-Vorgang einleitet. Das Herunterfahren selbst ist nur ein Call an die User32.dll glaub ich.

Es gibt auch Prozesse bzw Daemons die beim Runterfahren gestartet werden. Wie man die aber "anmeldet" weiß ich nicht.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich hab's mir jetzt nicht genauer angeschaut aber WM_QUERYENDSESSION könnte die Nachricht sein die du suchst. Die Seite geht zwar weiter auf Vista ein, sollte aber ein guter Ausgangspunkt sein.

Sebastian
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Danke! Ich werde jetzt mal testen, wann genau das Event "WM_QUERYENDSESSION" auftritt und ob ich dann noch das Herunterfahren abbrechen kann.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo!

Theoretisch funktioniert das mit WM_QUERYENDSESSION. Praktisch noch nicht. Da werde ich mich wahrscheinlich eine Weile damit spielen müssen. Aber vielleicht komme ich auch ohne Abhorchen von Events aus.

Ich würde am Liebsten vor dem Herunterfahren eingreifen. Also nur wenn der Benutzer selbst im Startmenü auf "Computer ausschalten..." klickt. Man müsste nur herausfinden, was nach dem Klicken ausgeführt wird. Vielleicht steht das sogar irgendwo in der Registry.

Falls das eine EXE ist, würde ich eine CMD-Datei dazwischenschieben. Falls man das aufzurufende Programm konfigurieren kann, würde ich gerne den Aufruf auf mein Programm umleiten. Und mein Programm würde dann danach den "Computer ausschalten"-Dialog aufrufen. So würde ich am Wenigsten ins System eingreifen müssen. Denn unter Vista scheint die Sache mit dem WM_QUERYENDSESSION komplizierter zu werden.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Ich schwöre dir, hättest du mich vor einem Monat gefragt, hätte ich es dir noch sagen können, wie der Befehl unter ausführen heißt. Ich will dir nur damit sagen --> Es geht. Ich weiß nur leider nicht mehr wie :-( Ich schau' mich mal um, okay?

^_^
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

In Tirol sagt man zu so etwas: "Sou a Schaß!" :evil:

http://thread.gmane.org/gmane.comp.pyth ... thon/54673

PS: Ich übersetze das lieber mal... "So ein Furz!" :wink:
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Hi nochmal,

es gibt doch auch nen Konsolenbefehl um den Shutdown abzubrechen, oder? "shutdown /a" ist es unter Vista.

Ansonsten haette ich da noch was aus einem VB-Forum. Vielleicht kann man da was ummuenzen:
http://www.xtremevbtalk.com/showthread.php?t=30002

EDIT: Mist... das irgendwer das Event schluckt ist bloed... :/
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo nkoehring!
nkoehring hat geschrieben:es gibt doch auch nen Konsolenbefehl um den Shutdown abzubrechen, oder? "shutdown /a" ist es unter Vista.
Leider kann man damit nur einen Shutdown-Countdown abbrechen. Wenn der Shutdown schon eingeleitet wurde funktioniert das nicht mehr.
nkoehring hat geschrieben:Ansonsten haette ich da noch was aus einem VB-Forum. Vielleicht kann man da was ummuenzen:
http://www.xtremevbtalk.com/showthread.php?t=30002
"QueryUnload" kenne ich von Visual Basic 6. Das ist genau das Gegenstück zum wxPython-Event "wx.EVT_QUERY_END_SESSION". Leider funktioniert das im Moment unter wxPython nicht.

Die andere Variante ist die, dass man mit "CallWindowProc" die Windows-Nachrichten an eine Prozedur weiterleitet. Das kenne ich auch von Visual Basic her. Aber genau so etwas möchte ich vermeiden, da es wahrscheinlich unter Vista nicht mehr wie gewünscht funktioniert und unter Python wahrscheinlich einiges an Kopfzerbrechen verursacht.

Aber vielleicht bleibt mir auch nichts anderes übrig und ich muss mit CallWindowProc arbeiten. Aber vorher warte ich noch ein paar Tage, ob nicht doch noch jemandem etwas besseres einfällt.

lg
Gerold
:-)

PS: Visual Basic 6 kennt "AddressOf". Damit kann man die Adresse einer Prozedur ermitteln. Wie finde ich unter Python die Adresse einer Prozedur heraus? Denn diese muss man an "CallWindowProc" übergeben.

EDIT:

OK, das Problem mit CallWindowProc und AddressOf wäre gelöst. --> http://aspn.activestate.com/ASPN/Cookbo ... ipe/355593
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Nachtrag:

Dieser Code fängt Windows-Nachrichten ab. Dass es funktioniert, habe ich mit dem Event ``WM_CHAR`` ausprobiert.
Aber von WM_QUERYENDSESSION bekomme ich nichts mit. Die Textdatei wird nicht erstellt. Kann es sein, dass schon XP das Event verschluckt und nicht erst wxPython?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import wx
import win32gui
import win32con
import win32api


class TestFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None)
        self.hwnd = self.GetHandle()
        self.oldWndProc = win32gui.SetWindowLong(
            self.hwnd, win32con.GWL_WNDPROC, self.MyWndProc
        )


    def MyWndProc(self, hWnd, msg, wParam, lParam):
        if msg == win32con.WM_CHAR:
            print "x"
        elif msg == win32con.WM_QUERYENDSESSION:
            f = file("J:\\Ablage\\queryendsession.txt", "w")
            f.write("queryendsession")
            f.close()
            
        if msg == win32con.WM_DESTROY:
            win32api.SetWindowLong(
                self.hwnd, win32con.GWL_WNDPROC, self.oldWndProc
            )
        
        return win32gui.CallWindowProc(
            self.oldWndProc, hWnd, msg, wParam, lParam
        )


app   = wx.PySimpleApp()
frame = TestFrame()
frame.Show()
app.MainLoop()
mfg
Gerold, der die Sache für heute ruhen lässt
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

http://www.pctipp.ch/praxishilfe/kummer ... ehren.html

das wäre ein Programm für dich...
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Hi Gerold!

Hmh, hilft Dir dat?

http://www.philognosie.net/index.php/tip/tipview/283/

Ich glaube so etwas hast Du eher gesucht. Ist wahrscheinlich ein wenig einfacher, als wenn man das über COM lösen müsste.

Gruß Andy
Zuletzt geändert von Andy am Montag 21. Januar 2008, 19:11, insgesamt 2-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Andy hat geschrieben:Hmh, hilft Dir dat?
Hallo Andy!

Danke. Eigentlich suche ich nur einen Hook, der es mir erlaubt, ein Programm ausführen zu lassen, bevor der "Computer ausschalten"-Dialog angezeigt wird. -- Also nicht wenn schon heruntergefahren wird. -- Wenn mein Programm fertig ist, wird mit "shutdown" heruntergefahren. Wenn mein Programm übersprungen wird, dann wird der "Computer ausschalten"-Dialog angezeigt. Das wäre die Ideallösung für mich.

Warum? Weil so noch keine Dienste heruntergefahren wurden und ich so auch Datenbanken sichern kann, ohne mich vorher darum kümmern zu müssen, dass diese nocheinmal hochgefahren werden. Außerdem wäre das der geringste Eingriff ins System. Ideal für Datensicherungen von DAU-Computern.

Der Benutzer klickt am Abend auf START->"Computer ausschalten". Dann poppt ein Dialog auf in dem er gefragt wird, ob er eine Sicherung durchführen und danach den Computer automatisch herunterfahren will, oder ob die Sicherung übersprungen werden soll. Wird die Sicherung übersprungen, dann öffnet sich ganz normal der "Computer ausschalten"-Dialog.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Naja, den Hook habe ich nicht gerade.

Aber zumindest kann man so den Ausschalten-Dialog erzwingen:

Neues Textdokument erstellen. Hier hinein schreibt man:

Code: Alles auswählen

(new ActiveXObject("Shell.Application")). ShutdownWindows();
Das sichert man dann Beispielsweise als Tschau.js ab. Per Doppelklick darauf, erhält man den Ausschalten-Diaog.


Ich geh aber davon aus, dass Du das schon kennst.
Python 47
User
Beiträge: 574
Registriert: Samstag 17. September 2005, 21:04

Hallo Gerold,

ich glaube zwar mein Lösung gefällt dir nicht, aber ich poste sie trotzdem:


Start -> Ausführen -> mmc -> Konsole -> Snap-In hinzufügen -> Hinzufügen -> Gruppenrichtlinien -> Hinzufügen -> Fertigstellen -> Schließen -> Ok -> Richtlinien für lokaler Computer -> Computerkonfiguration -> Skripts -> Herunterfahren -> hinzufügen

Bzw. noch eine Lösung:

http://www.pctipp.ch/praxishilfe/kummer ... ehren.html

Alle guten Dinge sind 3:

http://www.tech-archive.net/pdf/Archive ... g00051.pdf

Hoffe eine davon stellt dich zufrieden. =)
mfg

Thomas :-)
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

LOL, warum ignoriert eigentlich jeder meinen Post?^^
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

SchneiderWeisse hat geschrieben:LOL, warum ignoriert eigentlich jeder meinen Post?^^
Ah, jetzt verstehe ich erst worum es sich dreht. :oops: Naja, wir sind ja im Offtopic. Puuhh!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Python 47 hat geschrieben:Start -> Ausführen -> mmc -> Konsole -> Snap-In hinzufügen -> Hinzufügen -> Gruppenrichtlinien -> Hinzufügen -> Fertigstellen -> Schließen -> Ok -> Richtlinien für lokaler Computer -> Computerkonfiguration -> Skripts -> Herunterfahren -> hinzufügen
Hallo Python 47!

Danke. Das Problem bei Shutdown-Scripts ist, dass diese nur eine kurze Zeitspanne überleben. Dauern diese länger als (ich glaube) 60 Sekunden, dann werden sie von Windows gekillt, damit sie den Shutdown-Prozess nicht unterbrechen. Zumindest war das noch unter Windows NT so.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

SchneiderWeisse hat geschrieben:LOL, warum ignoriert eigentlich jeder meinen Post?^^
Hallo SchneiderWeisse!

Ich habe ihn nicht ignoriert. :-) Danke für deinen Link. Aber mein Ziel ist es ein solches Programm selber zu schreiben. Ein Programm, das ausgeführt wird -- ohne Drittprogramme -- wenn der Benutzer START --> "Computer ausschalten" klickt. Der Herunterfahr-Prozess soll also noch gar nicht stattfinden. Das ist nur meine Notlösung, dass ich den Herunterfahrprozess abbreche, wenn ich sonst nichts finde.

Ich hätte vielleicht nicht nach Offtopic posten sollen. :roll:

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

ja, ich hatte gedacht du suchst ein solches Programm.

Ich wäre aber auch an diesem Script interessiert, falls es nicht nur für dich allein sein soll^^

MfG
Antworten