| |
|
|
Stefan M. Caillet | Ich möchte gern diesen Code von Andreas Miethe dazu verwenden, um nach einem "Herunterfahren Befehl" noch einige Dinge zu erledigen. An und per sich kalppt das auch. Aber wenn das Erledigen etwas dauert, erscheint eine Dialogbox. die gerne diesen Code beenden würde. Klicke ich auf abbrechen kann der Code zwar seine Arbeit erledigen, aber Windows wird nicht mehr automatisch beendet. Ich möchte diesen Code so anpassen, dass Windows zwar das Runterfahren stillschweigend (ohne diese Dialogbox) unterbricht, aber wenn der Code Die notwendigen Dinge erledigt hat, dieser Windows sagt, dass es jetzt sofort runterfahren kann.Mein Code müsste also das Runterfahren abbrechen, und nach getaner Arbeit einen neuen ShutDown erzeugen, ohne jedoch selber wieder darauf zu reagieren. Leider finde ich im Code die Stelle(n) nicht, wo ich eingreifen muss (- kann). Also bitte ich um eure Aiuto.
#############################
Test-Programm per :
XProfan
#############################
Author : Andreas Miethe
August 2003
#############################
Thema : Windows-Ende abfangen
#############################
$H windows.ph
$H messages.ph
DEF HiWord(1) And(&(1)>>16,$FFFF)
DEF LoWord(1) And(&(1),$FFFF)
Declare Ende&,Button&,OldWindowProc&
Proc Speicher_Routine
Declare X&
Statt einer Speicher-Routine corre hier nur ein Zähler durch
~TextOut(%hDC,0,0,"Speicher-Dummy :",16)
Whilenot X& > 20000
Locate 2,0
Print X&
Inc X&
EndWhile
~TextOut(%hDC,0,100,"fertig mit Speichern :",22)
~TextOut(%hDC,0,150,"Taste.... :",11)
Waitinput
EndProc
Proc Frage_Speichern
If Messagebox("Erstmal alle Daten speichern ?","Windows_Ende?",36) = 7
return 1Windows wird sofort beendet
Else
bevor 1 zurückgegeben wird kann hier eine Speicher-Routine
eingebaut werden. Windows wird erst beendet wenn alles erledigt ist.
Speicher_Routine
return 1Windows wird nach dem Speichern beendet
return 0 Windows nicht beendet
Endif
EndProc
Proc WindowProc
Parameters Wnd&, Msg&, wParam&, lParam&
If Msg& = ~WM_COMMAND
If lParam& = Button&Control abfragen
If HiWord(wParam&) = ~BN_CLICKEDKlick auf Button
SendMessage(Wnd&,~WM_CLOSE,0,0)
Endif
Endif
Endif
If Msg& = ~WM_CLOSE
Speicher_Routine
~PostQuitMessage(0)Programm-Ende
Endif
If Msg& = ~WM_QUERYENDSESSION
Return Frage_Speichern()
Endif
alle Messages die nicht behandelt wurden an die Original-Prozedur weiterleiten
return ~CallWindowProc(OldWindowProc&,Wnd&, Msg&, WParam&, LParam&)
EndProc
set("FastMode",1)
SetTrueColor 1
WindowStyle 31
Window 0,0-640,480
CLS ~GetSysColor(~COLOR_BTNFACE)
Button& = CreateButton(%hwnd,"Ende",10,50,80,24)
Sendmessage(Button&,~WM_SETFONT,~GetStockObject(~DEFAULT_GUI_FONT),1)
Window-Prozedur austauschen und die Original-Prozedur in
OldWindowproc sichern
OldWindowProc& = ~SetWindowLong(%hwnd,~GWL_WNDPROC, ProcAddr(windowProc,4))
WhileNot Ende&
WaitInput
EndWhile
Danke Stefan |
|
|
| Ich habe grosses Glück, weil ich Mitmenschen helfen darf. Entwicklungsumgebung: XProfan11 , Win XP Pro 32Bit , Win XP Home ,Win7 HomePremium 64Bit PC: P4/3GHz , 2GB RAM , 1700GB HD Laptop: Intel Core 2 Duo /2,2GHz , 4GB RAM , 500GB HD | 12.08.2009 ▲ |
|
|
|
|
| Ich fürchte - um es kurz zu machen - das geht nicht (sauber).
Du könntest die Api(s) hooken und "zurücksetzen" und dann selbst selbige Shutdown-Anforderung nochmals absenden - ich meine aber hier sollte anders angesetzt werden weil auch solch Hook entweder vom OS nicht erlaubt wird/werden potuto (z.B. UAC) bzw. ach viel blabla... Wenn der Code aber nur per ein bestimmtes Windows sein soll, dann potuto man vlt. aber dennoch ansetzen. Geht es also z.B. einzig um Win98 - dann ist ein Hook vlt. eine Möglichkeit.
Besser wäre: Wenn Shutdown "registriert" (mit obigen Code) dann sofort beenden - z.B. alle States _fix abspeichern und erst beim nächsten Start Deiner Anwendung dann reagieren - z.B. mit Wiederherstellen der fix gespeicherten States. So bliebe es auf jeden Fall "sauber" und Du müsstest keine Kämpfe gegen das OS führen. |
|
|
| |
|
|
|
Stefan M. Caillet | Laut dem Code von Andreas gibt es ja die Möglichkeit Durch Return = 0 aus der Frage_Speichern Proc das herunterfaren abzubrechen. Was ich nun bräuchte ist danach die winproc wieder zu deaktivieren, und aus der While Ende& schleife rauszukommen. Danach kann ich meine Dinge erledigen und einen neuen Shutdown abzusetzen. Mein Problem: wie kann ich nach dem Return 0 diese Winproc wieder deaktivieren, dmit Windows seine messages wieder selber regelt? Stefan |
|
|
| Ich habe grosses Glück, weil ich Mitmenschen helfen darf. Entwicklungsumgebung: XProfan11 , Win XP Pro 32Bit , Win XP Home ,Win7 HomePremium 64Bit PC: P4/3GHz , 2GB RAM , 1700GB HD Laptop: Intel Core 2 Duo /2,2GHz , 4GB RAM , 500GB HD | 13.08.2009 ▲ |
|
|
|
|
| Achso, einfach indem Du OldWindowProc& nutzt statt procAddr und den SetWindowLong nochmals absendest. |
|
|
| |
|
|
|
Stefan M. Caillet | Sorry iF, steh auf dem Schlauch (wiedermal) Sei so lieb und zeig mir, wie und wo ich Was genau im Code einfügen muss. Wär mir echt ne grosse Aiuto. Danke. Stefan |
|
|
| Ich habe grosses Glück, weil ich Mitmenschen helfen darf. Entwicklungsumgebung: XProfan11 , Win XP Pro 32Bit , Win XP Home ,Win7 HomePremium 64Bit PC: P4/3GHz , 2GB RAM , 1700GB HD Laptop: Intel Core 2 Duo /2,2GHz , 4GB RAM , 500GB HD | 13.08.2009 ▲ |
|
|
|
|
| Du änderst die WProc ja mit der Zeile: wobei damit die vorherige procAddr ja in oldWindowProc& landet.
Na und wenn Du Deine wProc namens "WindowProc" wieder ablösen möchtest dann: womit (wie Du meintest "winproc wieder zu deaktivieren") Deine wndProc halt wieder raus aus dem Spiel ist.
Was ich eben nicht genau weiss ist, wann genau Du Deine eigene wProc wieder "abschiessen" willst aber die Zeile kannst Du einfügen wo Du möchtest. |
|
|
| |
|
|
|
Stefan M. Caillet | iF, glaub es oder glaub es nicht, aber es klappt! Ich hab da nämlich ne Möglichkeit gebraucht, auf nem älteren Laptop von ner älteren Frau, die nicht so fest im Sattel der Computerwelt sitzt, Daten wie die E-Mails, Adressbuch usw in regelmässigen abstänedn auf ne Speicherkarte im PCMCIA-Slot zu sichern. das Ganze soll absolut ohne ihr zutun beim Abschalten des "Lappis" (wie sie ihn liebevoll nennt) automatisch passieren. Acronis ist zwar nicht schlecht, fragt mir aber zu oft nach, und ich wollte dies so haben, dass eben keine rückfragen, sondern nur der Hinweis "BackUp wird erstellt - Der Computer schaltet sich danach automatisch aus") erscheint. Nun kann ich dieses Programm fertigstellen, denn dank Andreas Miethe und Dir iF funktioniert nun der Windows Hook. Danke eucch vielmals. |
|
|
| Ich habe grosses Glück, weil ich Mitmenschen helfen darf. Entwicklungsumgebung: XProfan11 , Win XP Pro 32Bit , Win XP Home ,Win7 HomePremium 64Bit PC: P4/3GHz , 2GB RAM , 1700GB HD Laptop: Intel Core 2 Duo /2,2GHz , 4GB RAM , 500GB HD | 13.08.2009 ▲ |
|
|
|
|
Sato Pinto | Hallo
Ja, zum Glück gibt es ein paar Leute hier in Xprofan den man nicht missen möchte. If und Andreas Miethe sind bestimmt auch damit gemeint. Manchmal soll "muss" man Komplimente an sie schreiben.
Gruss Pedro |
|
|
| |
|
|