closebutton von anderem programm abfragen und vorgang erlauben/abbrechen
-
ich hätte da ein spezielles problem

ich will eine dll schreiben, die mir zurückgeben kann ob bei einem anderen programm der closebutton betätig wurde und dann gegebenfalls den "schließvorgang" erlauben oder blockieren.
der grund ist,dass ich es für eine andere programmiersprache bei der ich nicht direkt auf winapi zugreifen kann. (jedenfalls nur sehr beschränkt.)also das handle von meinem zielprogramm kenn ich, dieses ruft die dll auch auf.
ob der closebutton betätigt wurde kann ich ja herausfinden wenn ich die messages abfamg. mein problem ist halt wie ich dann festlegen kann ob das fenster nun geschlossen werden soll oder nicht. denn wenn ich den closebutton anklicke, beendet es ja sofort, und wenn ich ihm vornerein den closebutton entferne bzw. deaktiviere bekomm ich auch keine nachricht mehr ob er angeklickt wurde.
.. ist eine etwas komplizierte beschreibung, ich hoffe sie ist einigermaßen verständlich und vielleicht kann mir jemand einen tipp geben wie ich daran gehen könnte. oder haltet ihr das für "nicht machbar"?
-
Müsste doch eigentlich über einen Message Hook gehen. Du bekommst dann alle Nachrichten und leitest ein WM_CLOSE nur dann weiter, wenn du willst das es geschlossen wird.
-
danke erstmal

wusst davor gar nicht das es soetwas gibt, sieht so aus als ob es genau das richtige ist.aber das thema ist ziemlich komplex.... blick da noch nicht ganz durch...
wäre vielleicht jemand bereit mir mal ein beispiel fürs grundgerüst zugeben.. ich finde einfach nichts gescheites.
also den aufbau dafür, dass ich von einer anderen anwendung (handle bekannt) alle message abfangen kann und nach belieben ersetzen etc.
mit SetWindowsHookEx installier ich einen hook, und muss ich dann irgendwie GetMsgProc zum abfangen der msg´s benutzen? hab jedenfalls keinen plan und meine versuche würd ich nicht als erfolgreich bezeichnen...
also wenns nicht zuviel arbeit ist
würd mich freuen.
-
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/usinghooks.asp
sollte dir weiterhelfen
-
Ich wollte auch mal verhindern das meine Anwendung geschlossen wird. Ich habe es so verstanden: du bekommst alle Nachrichten von deinem Programm zugesendet und kannst darauf reagieren...
Dann mach es doch einfach so:case WM_CLOSE: if(MessageBox(hWnd,"Sind Sie sicher, dass sie das Programm beenden möchten?", lpszMainWinName,MB_ICONQUESTION|MB_YESNO)==IDNO) message=0; //Wenn Nein geklickt, das Programm nicht beenden break;Du musst also einfach deine Nachricht auf 0 setzen, dann bleibt das Fenster normal bestehen.
Ich weiß nicht, ob das hier guter Stil ist, es funktioniert aber ganz prima!Hoffe, ich konnte dir helfen...
-
danke, aber das bringt mir nichts.
es soll ja für ein anderes programm (andere sprache) sein, dort kann ich nicht direkt auf winapi oder auf die nachrichten für diese zugreifen.
das mit den hooks ist schon das was ich gesucht habe, denke ich, wenn ich es irgendwann mal kapier
und mit dem link da oben kann ich relativ wenig anfangen..
-
ich hab in diesem zusammenhang gerade etwas von subclassing gelesen? ist das das gleiche wie hooks? falls nein, würde mir das bei meinem problem was nützen?
-
Nein Subclassing ist nicht das selbe wie hooks, aber das könnte für deinen fall ja sogar gehen. Du müsstest dann das freme Window subclassen.
-
ok.
also mit subclassing kann ich nachrichten an eine andere anwendung abfangen und ändern? (wo ist dann der unterschied zu hooks?)
und hat jemand einen guten link, beispiel zu diesem thema?
-
Ein Hook ist ein bei windows registrierter Eintrag, das bestimmte arten von nachrichten zuerst an dich gesendet werden sollen.
Subclassing bedeutet, das du die windowProc eines Fensters mit einer von dir selbstdefinierten überschreibst. Dadurch bekommst du die nachrichten zuerst in deine WindowProc und kannst dann danach an die alte WindowProc weiterleiten oder eben nicht.
Das mit dem subclassing dürfte aber problematisch werden:
- Das Fenster das du subclassen willst, befindet sich in einem anderen Prozess, sprich es hat einen anderen Adressraum.
- Du definierst jetzt eine eigene windowProc für das fremde fenster das zuerst aufgerufen werden soll, und überschreibst die alte mit der Adresse deiner WindowProc.
- Diese addresse ist jetzt aber leider nur in deinem adressraum gültig und nicht in dem der anderen anwendung... Das ist zwar auch umgehbar aber alles andere als Simpel (Code Injection)
-
bringt es etwas wenn ich dies in eine dll packe und diese mit dem programm aufrufe dessen messages ich abfangen/ändern etc. will?
-
Jop, sicher müsste klappen. Wenn du das fremde programm dazu kriegst die DLL zu laden, wird die DLL in den Speicherbereich des fremden Programmes gemappt und du kannst eine dort enthaltene WindowProc benutzen.
-
ok, danke

das programm für das ich es brauche hab ich ja selber geschrieben, kann in dieser sprache jedoch keine winapi funktion direkt benutzen etc. ...
aber dlls kann ich einbinden
-
ich möchte ja nicht nerven
, aber ich hab keine ahnung wie dies funktionieren soll...hat vielleicht irgendjemand lust ein klitzkleines beispiel zu machen?
wie ich also die messages abfangen, ändern etc. kann?
es würde schon reichen wenn ihr mir den aufbau ungefähr zeigt.
das ziel soll ja dann sein, das ich die message abfange wenn auf den closebutton geklickt wird und dann entscheiden kann ob diese aktion ausgeführt werden darf oder nicht.cu
danke.