Ich habe WM_CLOSE abgefangen, aber...



  • Ich möchte bei einer fremden Software beim Beenden eine "Möchten sie das Programm wirklich beenden? Ja/Nein" MessageBox erschienen lassen. Das hat auch toll funktioniert. Ich habe mir eine hook.dll compiliert ein kleines Programm für den Aufruf geschrieben und wenn durch die Message-Loop meines Hooks "WM_CLOSE" läuft blende ich wie geplant die besagte MessageBox ein. Wunderbar. Jetzt besteht wohl weder bei einem Hook vom Typ "WH_CALLWNDPROC" oder "WH_CALLWNDPROCRET" die Möglichkeit den Returnwert zu setzten wenn "WM_CLOSE" aufgerufen wird. Der Teilerfolg ist immerhin, dass ich jetzt daran erinnert werde, wenn ich das Programm versehentlich schliesse, aber verhindern kann ich das Schliessen dann doch nicht nach der besagten Methode. Hat jemand einen Tip wie ich vorgehn muss um besagte Funktionalität zu erhalten?

    Um's vorwegzunehmen, weil's mit Sicherheit mal wieder unterstellt wird. Ich möchte damit keinerlei schädliche Funktionen programmieren. Ich möcht damit lediglich verhindern, dass ich aus Versehen den Telekom NetPhone Client unserer Telefonsoftware beende und dann wieder solange nicht telefonisch erreichbar bin bis ich endlich raffe, dass ich das Teil mal wieder beendet habe.



  • Dazu wirst Du wohl das Fenster subclassen müssen.


  • Mod

    Du kannst die Keule benutzen und ein WM_DESTROY posten... das hat bei den meisten Programm zur Folge, dass diese kommentarlos schließen. Schön ist das nicht, weil einiges an Cleanup arbeiten nicht ausgeführt wird. DestroyWindow wird eben nicht ausgeführt.

    Ansonsten kannst Du auch einfach WM_CLOSE senden, kurz warten bis die MessageBox erscheint und ein WM_COMMAND mit IDNO senden...


  • Mod

    @swordfish sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Dazu wirst Du wohl das Fenster subclassen müssen.

    Subclassing geht nicht über Prozessgrenzen. Dann müsste er schon ein Code injezieren. Finde ich aber für so etwas overkill.



  • @martin-richter Ähm ... @Martin-Richter, der @Einsteiger will eben genau WM_CLOSE verhindern.



  • Ähm ich glaube hier liegt ein Missverständniss vor. Ich möchte verhindern, dass das fremde Programm sich schliesst. Kann ich ein fremdes Fenster subclassen? Ich dacht genau dafür ist der Hook das passende Werkzeugt



  • @einsteiger sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Kann ich ein fremdes Fenster subclassen?

    @martin-richter sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Subclassing geht nicht über Prozessgrenzen. Dann müsste er schon ein Code injezieren. Finde ich aber für so etwas overkill.

    Soo viel kill ist das garnicht: Subclassing using DLL Injection

    @einsteiger sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Ich dacht genau dafür ist der Hook das passende Werkzeug

    https://stackoverflow.com/a/13916590/3975177 sagte:

    WH_GETMESSAGE installs a hook for messages that are retrieved from the message queue. It does allow you to modify the message. But the problem is that WM_CLOSE is not posted to the message queue with PostMessage(), it is sent with SendMessage(). This hook can't see it.

    WH_CALLWNDPROC installs a hook that runs just before the window procedure is called. Which will allow you to see WM_CLOSE. However, you are not allowed to modify the message or make it disappear.



  • Quick & dirty: Das Systemmenü erfragen und per DeleteMenu den Punkt SC_CLOSE (MF_BYCOMMAND) entfernen.

    • unbeabsichtigt kann das Fenster nicht mehr über den Fenster-X-Button geschlossen werden
    • Über die Taskbar oder Alt+F4 kann es wahrscheinlich noch geschlossen und das Programm sauber beendet werden und muss nicht im Taskmanager abgeschossen werden
    • maximal 5 Zeilen Code...

  • Mod

    Müsste auch wie folgt gehen. WH_CALLWNDPROC dann Nachricht manipulieren und WM_CLOSE in WM_NULL faken...



  • @martin-richter sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Müsste auch wie folgt gehen. WH_CALLWNDPROC dann Nachricht manipulieren und WM_CLOSE in WM_NULL faken...

    Das geht nicht, habs gerade probiert. Ist es richtig, dass es mit DLL-Injection prinzpiell gehen sollte?. Bei Codeproject steht dass das injecten eines 32 Bit Programms unter eine 64Bit Win fehlgeschlagen ist.



  • @einsteiger sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Bei Codeproject steht dass das injecten eines 32 Bit Programms unter eine 64Bit Win fehlgeschlagen ist.

    Sollte kein Problem sein, wenn alles (Injector, Injectee, DLL) x86 oder x64 ist. Gemischt geht nicht.



  • @swordfish sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Sollte kein Problem sein, wenn alles (Injector, Injectee, DLL) x86 oder x64 ist. Gemischt geht nicht.

    Danke für die Hilfe. DLL-Injection hat die gewünschte Funktionalität hergestellt.



  • @einsteiger sagte in Ich habe WM_CLOSE abgefangen, aber...:

    Danke für die Hilfe.

    👍



  • Um die DLL in das Programm zu injizieren benutze ich zum Finden des Fensterhandles in meine Injectorprogramm FindWindow(NULL, "NetPhone Client"). Per CreateRemoteThread(...) wird die Injizierung durchgeführt. Das Fensterhandle des Zielprogramms hole ich dann in der DLL unter DllMain beim Event DLL_PROCESS_ATTACH ebenfalls mit FindWindow(NULL, "NetPhone Client"). Diese Stelle würde ich gerne optimieren. Wie kann ich in dieser Phase den Fensterhandel des Programms herausfinden, ohne dass ich vorher dessen Name schon in die DLL als String mit compiliert habe. Also zur Laufzeit.


Log in to reply