Seite 1 von 2

Windows: "Computer ausschalten"-Dialog

Verfasst: Montag 21. Januar 2008, 14:12
von gerold
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
:-)

Verfasst: Montag 21. Januar 2008, 14:25
von nkoehring
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.

Verfasst: Montag 21. Januar 2008, 14:26
von EyDu
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

Verfasst: Montag 21. Januar 2008, 14:30
von gerold
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
:-)

Verfasst: Montag 21. Januar 2008, 14:48
von gerold
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
:-)

Verfasst: Montag 21. Januar 2008, 14:51
von BlackVivi
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?

^_^

Verfasst: Montag 21. Januar 2008, 15:16
von gerold
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:

Verfasst: Montag 21. Januar 2008, 15:20
von nkoehring
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... :/

Verfasst: Montag 21. Januar 2008, 15:29
von gerold
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

Verfasst: Montag 21. Januar 2008, 15:58
von gerold
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
:-)

Verfasst: Montag 21. Januar 2008, 16:26
von nemomuk
http://www.pctipp.ch/praxishilfe/kummer ... ehren.html

das wäre ein Programm für dich...

Verfasst: Montag 21. Januar 2008, 18:44
von Andy
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

Verfasst: Montag 21. Januar 2008, 19:00
von gerold
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
:-)

Verfasst: Montag 21. Januar 2008, 19:13
von Andy
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.

Verfasst: Montag 21. Januar 2008, 19:13
von Python 47
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. =)

Verfasst: Montag 21. Januar 2008, 19:18
von nemomuk
LOL, warum ignoriert eigentlich jeder meinen Post?^^

Verfasst: Montag 21. Januar 2008, 19:29
von Andy
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!

Verfasst: Montag 21. Januar 2008, 19:49
von gerold
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
:-)

Verfasst: Montag 21. Januar 2008, 19:54
von gerold
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
:-)

Verfasst: Montag 21. Januar 2008, 20:10
von nemomuk
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