Italia
Foro

Erledigt: Shutdown Abfangen

 

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




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




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:
~SetWindowLong(%hwnd,~GWL_WNDPROC, OldWindowProc&)
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.
 
13.08.2009  
 




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
 
Sato Pinto
WIN XP Home
XPROFAN 11
13.08.2009  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

4.304 Views

Untitledvor 0 min.
RudiB.04.10.2016
Stefan M. Caillet29.07.2011
Untitled27.06.2011

Themeninformationen

Dieses Thema hat 3 subscriber:

Stefan M. Caillet (4x)
iF (3x)
Sato Pinto (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie