MessageBox-Funktion abfangen, um den Text davon zu ermitteln
-
Ich würde gern in meinem Programm, wann immer die MessageBox-Funktion (bzw. MessageBoxA bzw. MessageBoxW) aufgerufen wird, den Text der Message Box abfangen, um ihn irgendwo zu speichern. An sich nicht so kompliziert:
std::string message = "Es ist ein Fehler aufgetreten."; MessageBoxA(NULL, message, "Fehler", MB_OK); std::cerr << message << endl;Das Problem ist nur: Was ist, wenn ich Funktionen benutze, auf deren Quellcode ich keinen Zugriff habe, zum Beispiel irgendwelche allgemeinen Frameworks? Kann ich trotzdem die von dieser Lib aufgerufenen MessageBox-Funktionen abfangen und mir die Parameter geben lassen?
-
Warum willst du die Messagebox abfangen. Wenn du sie mit deinem Text aufrufst weist du doch den Text, du hast ihn schliesslich erstellt, also speichere doch einfach den Text vor oder nach dem Aufruf?
-
Auf welche Frameworks spielst Du an? MFC hat hier eine spezielle Überladung im CWinApp um genau das zu erlauben (DoMessageBox).
Bei anderen Frameworks oder UI Libs habe ich entsprechende Callbacks oder Interfaces.
-
...... schrieb:
Warum willst du die Messagebox abfangen. Wenn du sie mit deinem Text aufrufst weist du doch den Text, du hast ihn schliesslich erstellt, also speichere doch einfach den Text vor oder nach dem Aufruf?
Seufz:
Fragender Mensch schrieb:
An sich nicht so kompliziert:
std::string message = "Es ist ein Fehler aufgetreten."; MessageBoxA(NULL, message, "Fehler", MB_OK); std::cerr << message << endl;Das Problem ist nur: Was ist, wenn ich Funktionen benutze, auf deren Quellcode ich keinen Zugriff habe, zum Beispiel irgendwelche allgemeinen Frameworks?
Martin Richter schrieb:
Auf welche Frameworks spielst Du an?
Kein bestimmtes. Irgendwelcher beliebiger Quellcode, der zu meinem Programm gehört, den ich aber nicht verändern kann. Es muss auch nicht zwangsläufig die Message Box sein. Das war nur ein Beispiel. Stell dir, als anderes Beispiel, vor, dass ich ein GUI-Framework habe, das die WndProc des Fensters kapselt und nur bestimmte Nachrichten an mich weiterleitet und den Rest selbst bearbeitet. Jetzt will ich aber wenn die WM_PAINT-Nachricht oder WM_KEYDOWN oder was sonst noch kommt, selbst noch etwas machen. Also will ich in meinem Code irgendeine Möglichkeit einbauen, die mir sagt, wann irgendwo im Programm GetMessage aufgerufen wurde, um die Parameter von GetMessage dann selbst noch zu überprüfen. Oder stell dir vor, ich will mitzählen, wie oft in meinem Programm irgendwo ein Fenster erzeugt bzw. geöffnet wurde. Dann fang ich die CreateWindow und CreateWindowEx und diese Dialogfeldfunktionen ab.
-
Ich glaube, du willst einen Hook
-
Gibt es ein Tutorial, wo nichtsystemweite Hooks mal anschaulich, verständlich und mit Beispielen erklärt werden? Bisher hab ich da immer nur unzulängliches gefunden, wo einem da irgendwelche Einzelinformationen hingeklatscht werden und es heißt: "Friss oder stirb".
-
Klar, ich bin doch Captain Hook!
Nutze am besten die CreateRemoteThread-Methode, um eine DLL in einen fremden Prozess zu laden.
In dieser DLL nutzt du am besten Microsoft Detours, um eine Funktion umzuleiten.Frag einfach nach Konkretem, komplette Tutorials dazu sind mir nicht bekannt und ich will jetzt auch nicht für dich suchen.
-
Fragender Mensch schrieb:
Martin Richter schrieb:
Auf welche Frameworks spielst Du an?
Kein bestimmtes. Irgendwelcher beliebiger Quellcode, der zu meinem Programm gehört, den ich aber nicht verändern kann. Es muss auch nicht zwangsläufig die Message Box sein. Das war nur ein Beispiel. Stell dir, als anderes Beispiel, vor, dass ich ein GUI-Framework habe, das die WndProc des Fensters kapselt und nur bestimmte Nachrichten an mich weiterleitet und den Rest selbst bearbeitet. Jetzt will ich aber wenn die WM_PAINT-Nachricht oder WM_KEYDOWN oder was sonst noch kommt, selbst noch etwas machen. Also will ich in meinem Code irgendeine Möglichkeit einbauen, die mir sagt, wann irgendwo im Programm GetMessage aufgerufen wurde, um die Parameter von GetMessage dann selbst noch zu überprüfen. Oder stell dir vor, ich will mitzählen, wie oft in meinem Programm irgendwo ein Fenster erzeugt bzw. geöffnet wurde. Dann fang ich die CreateWindow und CreateWindowEx und diese Dialogfeldfunktionen ab.
Das ist albern und mir zu allgemein. Für jede dieser Situationen gibt es ein anderes Verfahren. Subclassing, Message Hooks, Superclassing, ...
Werde spezifisch oder mach Dir erstmal klar was Du brauchst und willst.
http://www.codeproject.com/kb/system/hooksys.aspx
http://www.codeproject.com/KB/system/inject2it.aspx
http://www.microsoft.com/MSJ/0298/BUGSLAYER0298.aspx
-
Fragender Mensch schrieb:
Gibt es ein Tutorial, wo nichtsystemweite Hooks mal anschaulich, verständlich und mit Beispielen erklärt werden?
Captain Hook schrieb:
Nutze am besten die CreateRemoteThread-Methode, um eine DLL in einen fremden Prozess zu laden.
WTF? spreche ich spanisch?
-
Die Beiträge, die ich Dir gegeben habe, funktionieren auch In-Process.
Hooks sind systemweit oder prozesslokale. (Siehe MSDN).
-