Autor Beitrag
freedy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Do 09.07.09 16:16 
Hallo,

ist es möglich, wenn an mein Programm die Mitteilung gegeben wird, dass Windows beendet wird, zu erfahren, ob es sich um einen Neustart, Herunterfahren oder Benutzer abmelden handelt?

Habe bisher leider nichts gefunden und die Windows API ist für mich (noch) ein rotes Tuch. ;) Gibt es da irgendwelche Tutorials, um sich da ranzutasten?

Grüße,
Micha
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 09.07.09 16:48 
Moin!

IIRC wird beim WM_QUERYENDSESSION mitgesendet, was passiert (oder war´s beim dann folgenden WM_ENDSESSION? togal, das steht im MSDN). Aber: nur Toplevel-Windows kriegen diese Messages! :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Do 09.07.09 16:58 
Schau doch mal hier im Forum z.B. nach diesen Thread.
Da steht doch ein Verweis auf WM_QUERYENDSESSION.


Zuletzt bearbeitet von ffgorcky am Do 21.03.13 21:05, insgesamt 1-mal bearbeitet
freedy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Do 09.07.09 19:15 
Hi.

Erst eimal vielen Dank. WM_QUERYENDSESSION habe ich vorher nicht gefunden. Es kann einfach schon daran gelegen haben, dass ich z. B. nicht nach Reboot und ähnlichem gesucht habe. Man kann ja auch nicht ahnen, welche Topic-Begriffe die anderen User gewählt haben.

Deine Kritik klingt schon etwas barsch, und es fällt mir schwer, sie nicht so aufzufassen. Aber okay...

Letztlich passiert folgendes: ein Delphi-Programm, von dem ich nur den Entwickler kenne, fängt das Beenden ab, führt noch Code aus und setzt dafür irgendwie das Beenden außer Kraft. Dummerweise wird nicht abgefangen, wie der Rechner beendet wird, deshalb fährt der Rechner, auch wenn man als Benutzer Neustart wählt, den Rechner immer ganz herrunter. Ziemlich nervig...

Ich werde den Hinweis mal weitergeben. Danke nochmal.

Grüße,
Michael
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.07.09 21:10 
user profile iconfreedy hat folgendes geschrieben Zum zitierten Posting springen:
Letztlich passiert folgendes: ein Delphi-Programm, von dem ich nur den Entwickler kenne, fängt das Beenden ab, führt noch Code aus und setzt dafür irgendwie das Beenden außer Kraft.
Dafür gibt es ab Vista auch eine entsprechende Funktion, bei dem der Benutzer eine Nachricht angezeigt wird, warum das Programm noch zu tun hat. Man muss lediglich Bescheid sagen, dass das Programm im Moment gerade noch etwas zu tun hat.

Das sind die Funktionen ShutdownBlockReasonCreate usw.:
msdn.microsoft.com/e...ibrary/aa376877.aspx

Wie das genau unter XP und Vista funktioniert und was sich da geändert hat ist sehr detailliert in der Dokumentation beschrieben:
msdn.microsoft.com/e...ibrary/ms700677.aspx
freedy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Di 14.07.09 10:51 
Ich habe jetzt probiert, mir mal Demoanwendungen zu bauen, die mir zurückliefern, ob Windows nun heruntergefahren oder neu gestartet werden soll. Mit WM_QUERYENDSESSION oder ähnlichem ist dies nicht möglich.

Man muss einen API Hook progammieren. Mache mich da mal dran und poste hier, wie weit ich gekommen bin. Der Link im von ffgorcky verwiesen Thread funktioniert nicht mehr, weil das SwissDelphiCenter sein Forum umgestellt hat. Naja... ich werde mich weiter schlau machen. Das Problem mit dem Herunterfahren oder Neustarten haben nämlich anscheinend einige...

Grüße,
Micha
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 14.07.09 14:14 
Also zu mindest das Abmelden bekommen man über wm_queryendsession mitgeteilt und zwar über den lParam.
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: Di 14.07.09 17:48 
Also dann würde ich ja aber erst mal in den Autostart-Einstellungen gucken:
sowohl in der Registry:
- HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run und in
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run,
als auch in den Ordnern Deines Betriebssystems:
- C:\Dokumente und Einstellungen\All Users\Startmenü\Programme\Autostart und in
- C:\Dokumente und Einstellungen\WieAuchImmerDeinBenutzerHeißt\Startmenü\Programme\Autostart
(hier evtl. vorher erst mal die Einstellung auf "alle Dateien und Ordner anzeigen" (unter Extras-Ordneroptionen-Ansicht-Versteckte Dateien und Ordner) setzen)

Irgendwo muss sich dann ja wohl ein "Virus" (z.B. das Scherzprogramm des Dir bekannten Entwicklers oder sowas in der Art) befinden.

Ich denke mal nicht, dass er sich schon weiter mit anderen Startmöglichkeiten (z.B. C:\WINDOWS\Win.ini) auskennt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 14.07.09 19:40 
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Irgendwo muss sich dann ja wohl ein "Virus" (z.B. das Scherzprogramm des Dir bekannten Entwicklers oder sowas in der Art) befinden.
Wie kommst du darauf, dass es ein Scherzprogramm oder ähnliches ist? :gruebel:

Das genannte Delphiprogramm fängt eben das Herunterfahren ab um nicht beim Speichern oder so unterbrochen zu werden. Das ist ja nicht ungewöhnlich, nicht umsonst gibt es genau dafür in Vista eine API.
freedy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 403
Erhaltene Danke: 1

Winows 7
Delphi XE
BeitragVerfasst: Mi 15.07.09 13:03 
user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Also dann würde ich ja aber erst mal in den Autostart-Einstellungen gucken:
Irgendwo muss sich dann ja wohl ein "Virus" (z.B. das Scherzprogramm des Dir bekannten Entwicklers oder sowas in der Art) befinden.


Es ist kein Scherzprogramm sondern ein Backup-Programm, das mir meine Source beim Beenden meiner Windows-Session auf einem Server sichern soll. Nur nur dann! Der Neustart interessiert mich nicht.

user profile iconffgorcky hat folgendes geschrieben Zum zitierten Posting springen:
Ich denke mal nicht, dass er sich schon weiter mit anderen Startmöglichkeiten (z.B. C:\WINDOWS\Win.ini) auskennt.

Irrtum. Und natürlich steht das Backup-Programm in den RUN-Einträgen meiner Registry. Ich habe es ja selbst dort reingeschrieben.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das genannte Delphiprogramm fängt eben das Herunterfahren ab um nicht beim Speichern oder so unterbrochen zu werden. Das ist ja nicht ungewöhnlich, nicht umsonst gibt es genau dafür in Vista eine API.


Genau. Unter Vista ist das inzwischen soweit kein Problem mehr. XP kennt die Unterbrechung des Herunterfahrens noch nicht. Deshalb ist es ja möglich, das Beenden in OnCloseQuery zu unterbinden, um irgendwelche Vorgänge zu beenden. Ob man jetzt die Windows Messages abfängt oder das vorbereitete Ereignis benutzt, ist da wohl egal. Ich persönlich tendiere dann eher zum Ereignis. Das Problem ist das Neuiniitieren des Herunterfahrens; denn woher weiß das Programm, das soeben noch das Herunterfahren abgebrochen hat, welchen Beenden-Modus der Benutzer gewählt hat.

Und wenn man sich mal die MSDN-Hilfe anschaut, steht dort sogar ausdrücklich drin:

Zitat:
lParam
If this parameter is zero, the system is shutting down or restarting (it is not possible to determine which event is occurring).



Eine richtige Lösung habe ich derzeit noch nicht. Leider. Wenn irgendwer sonst etwas gefunden hat, würde mich das sehr freuen. ;-)

Grüße


Zuletzt bearbeitet von freedy am Mi 15.07.09 13:06, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 15.07.09 19:23 
user profile iconfreedy hat folgendes geschrieben Zum zitierten Posting springen:
Eine richtige Lösung habe ich derzeit noch nicht. Leider. Wenn irgendwer sonst etwas gefunden hat, würde mich das sehr freuen. ;-)
Ich habe derzeit leider keine Zeit mir das anzuschauen, aber ich hätte eine Idee:

Wie wäre es, wenn das Programm einfach beim Speichern ein Fenster anzeigt mit den Knöpfen herunterfahren und neu starten? Dann drückt man darauf und wenn es fertig ist, dann macht es die gewählte Aktion.

Das Programm hat ja sicherlich Einstellungen, in denen man auch einstellen könnte was bis XP standardmäßig gemacht wird (herunterfahren, neu starten, Fenster anzeigen, ...). Ich nehme an, dass der Autor das gut einbauen könnte und es auch andere Nutzer des Programms nutzen würden.
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 27.08.12 13:13 
Es gibt im EC (Embedded Controller) 256 Register (Bytes), von denen viele frei sind.
Um dem EC Shutdown oder Reboot zu befehlen, braucht man nur ein einziges Bit.
Mir ist schon mal beim Testen ein Notebook heruntergefahren, habe das aber nicht weiter verfolgt...

Wenn ich heute abend Zeit habe, schaue ich mal nach, ob meine Vermutung richtig ist.
Alternativ wäre auch im CMOS-RAM noch genug Platz...