| |
|
|
| 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 |
|
|
| |
|
|
|
Frank Abbing | Hallo Andeas,
mit XProfan könntest du das sicher über ein Subclassing realisieren Aber auch mit niedrigeren Profanversion sollte das möglich sein. Auf meiner Webpage findest du die kleine Freeware Message.dll. Damit kannst du jede Message empfangen. In jedem Fenster und ab Profan 5. |
|
|
| |
|
|
|
| Sagen wir mal so - es wäre auch sinnvoll wenn Roland diese ok-killme nicht generell sendet - sondern vielleicht die Abhandlung dessen einer XProfan-Proc überlässt.
Salve, iF |
|
|
| |
|
|
|
| Hallo IF...
Das sehe ich genauso, leider hilft mir das jetzt nicht weiter. Gibt es keine API die Messages abfängt und eine beliebige Rückmeldung an Windows sendet?...
Ich habe hier mal einen Quellcode in Delphi - habe leider zu wenig Ahnung um den komplett zu verstehen und umzusetzen. Kann jemand [...] was anfangen?
@Frank: Ich habe leider keine Idee, wie mir deine DLL da weiterhelfen kann. Was kann die alles? |
|
|
| |
|
|
|
| Hallo...
OK, ich glaube den Quelltext habe ich jetzt verstanden: An Offset GWL_WNDPROC des Fensters befindet sich die Adresse einer Prozedur. Diese Prozedur ist dafür zuständig Messages, die an das Fenster gesendet werden, zu verarbeiten. Um Messages, die an das Fenster gendet werden, nicht zuerst von dieser Prozedur behandeln zu lassen, setzt man einfach mit SetWindowlong den Wert bei GWL_WNDPROC auf die Adresse einer anderen Prozedur und merkt sich die Adresse der alten Prozedur. In meinem Fall müßte diese Prozedur bei der ankommenden Message WM_QUERYENDSESSION eigentlich nur den Wert 0 zurückgeben - oder 1 wenn das System heruntergefahren werden soll. Alle anderen Messages müßten dann mit CallWindowProc innerhalb dieser Prozedur auf die gemerkte, alte Adresse umgeleitet werden.
Mit Profan, jedenfalls mit Version 7.5, komme ich - soweit ich weiß - nicht an eine Adresse einer in meinem Programm stehenden Prozedur. Wenn ich aber ein DLL hätte, könnte ich die Adresse einer dort stehenden Prozedur mit GetProcAddress herausfinden und diese für das SubClassing verwenden.
Habe ich jetzt totalen Mist verzapft oder stimmt das in etwa so??? ~?~ |
|
|
| |
|
|
|
Frank Abbing | Hi,
ziemlicher Mist, ja. Denke daran, Profan ist und bleibt eine Interpretersprache. Du hast meine Dll, die listet dir jede Message auf. Ob du so das Herunterfahren abfangen kannst, weiss ich nicht. Das mußt du selber harausfinden, ich hab momentan einfach viel zuwenig Zeit... |
|
|
| |
|
|
|
| Macht nichts, Frank - gibt ja auch noch andere. Es klappt - so wie ich das möchte - mit deiner DLL leider nicht.
An alle anderen: Kann mir als unwissendem sonsteiner mal erklären, was Subclassing genau ist? Was genau ist ziemlicher Mist an meinen Überlegungen???
Ziel der Sache ist in etwa ein Verhalten wie es Notepad zeigt: Wenn Windows heruntergefahren wird und eine Datei gerade bearbeitet, aber noch nicht abgespeichert wurde, gibt Notepad eine Messagebox aus. Wenn hier abbrechen gedrückt wird, wird das System nicht heruntergefahren. |
|
|
| |
|
|
|
CB | Hi, Andreas!
Direkt weiterhelfen kann ich Dir leider nicht, aber schau Dir das mal näher an: [...] Ist ein ziemlich geniales Programm mit ein paar dlls, die allerdings mit ResourceHacker nicht zu öffnen sind (ASM-Dlls?). Vielleicht hast Du da ne Möglichkeit dazu - oder Frank, falls er mal weniger Überfluß an Arbeit hat?
Gruß, Christian |
|
|
| |
|
|
|
| Hallo Christian...
Das Programm werde ich mir auf jeden Fall ansehen - leider wird es mir bei meinem Problem nicht helfen. Windows sendet beim Herunterfahren die Message WM_QUERYENDSESION an jedes Toplevelfenster. Jedes Fenster gibt, bedingt durch seine Klasse (wenn ich das richtig verstehe), eine Wert (entweder 1 oder 0) an Windows zurück. 1=Windows darf heruntergefahren werden 0=Windows darf nicht heruntergefahren werden. Erst wenn alle Fenster eine 1 zurückliefern, wird Windows beendet und die Message WM_ENDSESSION an jedes Toplevelfenster gesendet => siehe Notepad.
Die Message WM_QUERYENDSESION kann ich unter bestimmten Bedingungen auch mit Profan empfangen => vorausgesetzt ich arbeite mit Windows98, da dort das Herunterfahren etwas anders abläuft als unter WindowsNT. Da mein Programm - wohl bedingt durch das, was ich als Fensterklasse verstehe - aber sofort nach dem Empfang der Message gekillt wird, bringt mir das nichts.
Ich muß also irgendwie an die Klasse meines Hauptfensters ran, um dort etwas zu verändern. Mit Profan alleine geht das wohl nicht - jedenfalls nicht mit 7.5, denn dazu brauche ich die Adresse einer Art Ersatzprozedur.
Meine Frage: Kann ich mit XProfan Subclassing realisieren? Gibt es eine Möglichkeit Subclassing über externe DLLs zu regeln? Habe ich den Begriff Subclassing überhaupt richtig verstanden???
|
|
|
| |
|
|
|
Frank Abbing | Hi,
Subclassing ist das Einfügen eines eigenen Codes in die Windows-Message Prozedur. Wird eine Message ausgelöst, dann wird diese eigene Routine angesprungen, bevor in der Windows-Message Prozedur die ankommende Message weiter bearbeitet wird. Dieser eigene Code kann jetzt Messages verändern, entfernen oder selber welche erzeugen. Du könntest hier also deine gewünschte Message einfach löschen oder entsprechend darauf reagieren. Etwa so: KompilierenMarkierenSeparieren Schau doch mal bei Andreas Miethe vorbei. Der hat schon einige XProfancodes erstellt, die Profans Windowsprozedur subclassen. Ich selber pflege das immer nur in eine Dll verpackt mit Assembler zu machen.
@Christian: Vielleicht sind die Dlls gepackt? |
|
|
| |
|
|
|
CB | [quote:7658e6b148=Frank Abbing]@Christian: Vielleicht sind die Dlls gepackt?[/quote:7658e6b148] ResourceHacker zeigt nur ein leeres Feld, keinerlei Einträge. Ich habe dann mal mit einem speziellen Editor (eigentlich ein Plugin vom Total Commander) hineingeschaut:
FILE CHARACTERISTICS : File is executable (i.e. no unresolved external references) COFF line numbers have been removed COFF symbol table entries for local symbols have been removed Machine based on 32-bit-word architecture File is a DLL
Ach was - das Prog. ist Freeware. Ich schick Euch mal die dlls einfach mit. Vielleicht könnt Ihr ja was damit anfangen.
Gruß, Christian |
|
|
| |
|
|
|
Frank Abbing | Gerade gefunden: [...] Andreas hat sowas schon geschrieben |
|
|
| |
|
|