| |
|
|
- Seite 1 - |
|
| Hallo Profaner...
Ich habe folgendes Problem: Auf den Versuch Windows herunterzufahren muß ein Programm von mir entsprechend reagieren.
Ich weiß, das Windows beim Herunterfahren die Message WM_QUERYENDSESSION an jedes Programm sendet und auf eine positive Rückmeldung wartet. Wie kann ich diese Message mit Profan abfangen und entsprechend behandeln? Hat jemand eine Idee???
Profan 7.5 => Windows2000/XP |
|
|
| |
|
|
|
| |
|
- Seite 1 - |
|
Frank Abbing | Gerade gefunden: [...] Andreas hat sowas schon geschrieben |
|
|
| |
|
|
| |
|
- Seite 2 - |
|
|
| Nochmals besten Dank, Frank. Das zeigt mir eigentlich schon, daß ich die Sache richtig verstanden habe. Ich werde mich mal auf Andreas Homepage umsehen. Bislang kenne ich nur die Möglichkeit, mit SetWindowLong die Adresse der neuen Prozedur zu übergeben, vielleicht komme ich da noch auf neue Ideen. |
|
|
| |
|
|
|
| Hallo Frank...
Dein Tipp war goldrichtig und hat mir fast alle meiner Fragen auf einmal beantwortet . Kann man Subclassing auch mit externen DLLs realisieren, oder muß die Prozedur innerhalb meines Programms stehen? |
|
|
| |
|
|
|
Frank Abbing | Hi,
nein, eine externe Dll geht natürlich auch. Siehe Message.dll |
|
|
| |
|
|
|
| Da habe ich wirklich eine ganze Menge dazugelernt . Leider zeigt mir das aber auch, daß ich mit meiner jetzigen Profanversion auf keinen Fall weiterkomme.
Ich habe jetzt folgende große Bitte an jeden von euch: Ich brauche für eines meiner Shareware Programme eine mit UPX komprimierte XProfan EXE als Freeware. Dieses Programm soll mittels Subclassing die Message WM_QUERRYENDSESSIN abfangen und, wenn diese Message aufgetreten ist, Windows mit dem Profanbefehl ExitWindows 4 herunterfahren. Das von der EXE erzeugte Fenster muß unsichtbar sein. Ob das Programm in der Taskleiste erscheint, ist egal (Übergangslösung, bis ich XProfan habe).
Das hört sich vielleicht ziemlich kompliziert an, in Wirklichkeit sind das aber nur ein paar Zeilen Quelltext. Fast alles, was man zu diesem Programm braucht - sogar den größten Teil des Quelltextes (nämlich das Subclassing der Message WM_QUERRYENDSESSION) - findet man eigentlich schon auf der XProfan Homepage von Andreas Miethe. Das ganze dürfte also nur eine Arbeit von ein paar Minuten sein.
Ich weiß, daß das eine sehr große Bitte ist, und ich wäre auch nicht böse, wenn mir diesen Wunsch niemand erfüllen würde - aber riesig freuen würde ich mich schon. |
|
|
| |
|
|
|
| Nein eigendlich keine große bitte - Du holst Dir einfach die neuste XProfan-Shareware ausm Downloadbereich und proggst was Du brauchst. Das Compilieren inne Exe wird sicherlich jemand für Dich übernehmen.
Salve, iF |
|
|
| |
|
|
|
Frank Abbing | Hi,
mach den Code nach deinen Vorstellungen fertig und schicke ihn mir ruhig zu. Ich kompiliere ihn für dich und schicke dir die Exe zurück. Noch besser wäre es, du legst dir XProfan zu... |
|
|
| |
|
|
|
Michael Dell | Hallo,
meint ihr so etwa? KompilierenMarkierenSeparierenDef CallWindowProc(5) !"USER32.DLL","CallWindowProcA" lpPrevWndFunc&,hwnd&,MSG&,wParam&,lParam&
Def SetWindowLong(3) !"USER32.DLL","SetWindowLongA" hwnd&,nIndex&,dwNewLong&
Def &GWL_WNDPROC -4
Def &WM_QUERYENDSESSION $0011
Def &WM_CANCELMODE $001F
Declare gHW&,lpPrevWndProc&
Proc NewWindowProc
Parameters hw&,uMsg&,wParam&,lParam&
Declare Ant&
Case (uMsg& = &WM_QUERYENDSESSION): ExitWindows 4
Return CallWindowProc(lpPrevWndProc&,hw&,uMsg&,wParam&,lParam&)
EndProc
Proc Hook
gHW& = %hwnd
lpPrevWndProc& = SetWindowLong(gHW&,&GWL_WNDPROC,ProcAddr("NewWindowProc",4))
EndProc
Window Add(%maxX,10),100-25,25
ShowWindow(%HWnd,0)
Hook
While 1
WaitInput
EndWhile
End
Hab das mal mit Profan2Cpp & UPX auf 76kB gedrückt: [...]
Vielleicht isses ja brauchbar.
Gruß
Michael... |
|
|
| Salu Michael...
Hab zwar krumme Fieß awer dofir e' ecklich Gsicht! | 22.02.2005 ▲ |
|
|
|
|
| Hallo Michael...
Denk dir einen Schönen Titel für das Fenster aus und kompiliere das zur EXE - das müßte es sein! Zum Testen des Programms kanns du einfach Notepad starten, einen kleinen Text eingeben und nicht speichern. Wenn du dann das Programm startest und Windows danach herunterfahren läßt, soll Windows ohne Nachfrage beendet werden.
@IF... Mein Rechner ist mit Profanversionen bis zum Stehkragen gefüllt - laufend gibt es Probleme die richtige Hilfe zu starten. Deshalb ziehe ich mir jetzt nicht die Sharewareversion - aber demnächst die Vollversion.
Vielen Dank an alle für ihre Hilfe!
|
|
|
| |
|
|
|
| Für solcherlei Probleme gibs doch aba den XPSE.
Naja und die Hilfe... da braucht man doch eigendlich imma nur die Neueste.
Salve, iF |
|
|
| |
|
|
|
| Hallo Michael...
Au bion ich blöd! Hab den Link ganz übersehen - Programm ist ja schon fertig! Werds morgen gleich testen!!!
|
|
|
| |
|
|
|
| Hallo Michael...
Das Programm funktioniert hervorragend und ist haargenau und bis aufs I-Tüpfelchen genau das was ich haben wollte! ~pressmee~
...Vielleicht hilft es ja noch irgendeinem weiter, wenn ich jetzt mal genauer auf die Unterschiede beim Herunterfahren von Windows eingehe:
Windows95/98/ME=> Es wird an jedes Toplevelfenster die Message WM_QUERYENDSESSION gesendet. Erst wenn alle Fenster eine 1 zurückgeliefert haben, wird die Message WM_ENDSESSION an die Fenster geschickt, die alle laufenden Programme beendet. Liefert ein Fenster als Antwort auf WM_QUERYENDSESSION 0 zurück, wird die Message WM_ENDSESSION nicht abgeschickt.
WindowsNT/2000/XP=> Es wird an jedes Toplevelfenster die Message WM_QUERYENDSESSION geschickt. Jedes Fenster, das eine 1 zurückliefert, erhält dann die Message WM_ENDSESSION , was dazu führt, daß das betreffende Programm beendet wird. Liefert ein Fenster auf WM_QUERYENDSESSION 0 zurück, wird der ganze Prozess abgebrochen und es wird an die nachfolgenden Fenster weder die Message WM_QUERYENDSESSION noch die Message WM_ENDSESSION gesendet. Welches Fenster zuerst die Message WM_QUERYENDSESSION bekommt, hängt davon ab, wann der dazugehörige Prozess gestartet wurde (meiner Meining nach eine extrem unideale Variante des Shutdowns). |
|
|
| |
|
|