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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Windows: "Computer ausschalten"-Dialog

Beitragvon gerold » Montag 21. Januar 2008, 14:12

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:

Beitragvon nkoehring » Montag 21. Januar 2008, 14:25

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.
EyDu
User
Beiträge: 4866
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Montag 21. Januar 2008, 14:26

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 21. Januar 2008, 14:30

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 21. Januar 2008, 14:48

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:

Beitragvon BlackVivi » Montag 21. Januar 2008, 14:51

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 21. Januar 2008, 15:16

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:

Beitragvon nkoehring » Montag 21. Januar 2008, 15:20

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... :/
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 21. Januar 2008, 15:29

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 21. Januar 2008, 15:58

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

Beitragvon nemomuk » Montag 21. Januar 2008, 16:26

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....

Beitragvon Andy » Montag 21. Januar 2008, 18:44

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Montag 21. Januar 2008, 19:00

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....

Beitragvon Andy » Montag 21. Januar 2008, 19:13

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

Beitragvon Python 47 » Montag 21. Januar 2008, 19:13

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:

www.tech-archive.net/pdf/Archive/German ... g00051.pdf

Hoffe eine davon stellt dich zufrieden. =)
mfg

Thomas :-)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder