Entwickler-Ecke
Sonstiges (Delphi) - Balloon-Messag aus Systray auslesen
Singlepin - Do 29.09.11 17:38
Titel: Balloon-Messag aus Systray auslesen
Hallo Gemeinde,
ich habe einen globalen Haken ins System gehauen und kann damit folgende Infos erhalten,
lParam: soll die Struktur mit den Infos die ich brauche enthalten
wParam: steht auf 1
message: enthält die richtige Nummer zum Anzeigen der Balloon-Message
hWnd: das Handle auf die Anwendung die die Balloon-Message sendet, stimmt auch.
soweit so gut, nun kommt das Problem:
hier mal ein bißchen Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| hFile:=CreateFile('...\messageinfo.log',GENERIC_WRITE or GENERIC_READ,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
...
try SetFilePointer(hFile, 0, nil, FILE_END); PID:=GetCurrentProcessID; FileSatz.PID:=PID; FileSatz.lParam:=lParam; FileSatz.wParam:=wParam; FileSatz.a.lParam:=CWPS(Pointer(LParam)^).lParam; FileSatz.a.wParam:=CWPS(Pointer(LParam)^).wParam; FileSatz.a.message:=CWPS(Pointer(LParam)^).message; FileSatz.a.hWnd:=CWPS(Pointer(LParam)^).hwnd; if FileSatz.a.message=wm_IconMessages then begin IconData:=NOTIFYICONDATA(Pointer(FileSatz.a.lParam)^); WriteFile(hFile,IconData,Sizeof(IconData),sizewritten,nil); end; finally CloseHandle(hFile); end; |
Die FileWrite Anweisung kann es auch nicht sein. Die hatte ich zuvor zum Schreiben von FileSatz benutzt.
Offenbar bekomme ich beim Auslesen der Daten zum zuweisen für IconData die Zugriffsverletzung.
Die Frage lautet: "warum"?
Singlepin - Sa 08.10.11 18:46
OK, ich war nicht untätig.
Der Fehler tritt auf, da ich versuche im Speicher einer anderen Anwendung zu lesen. Windows verhindert das.
Ich dachte nun, daß mit „ReadProcessMemory“ und „Toolhelp32ReadProcessMemory“ diese Schutzfunktion zu umgehen ist. In beiden Fällen werden 0 Byte gelesen. Wenn ich ein beliebiges Handle in die vorgenannten Funktionen einsetze wird der Speicher ausgelesen. Was aber keinen Wert hat, da das Bereiche sind die keinen Sinnvollen Inhalt enthalten.
Meine Frage ist nun, ob unter Windows XP, der Speicher der von anderen Anwendungen belegt wird überhaupt ausgelesen werden kann und wenn ja welchen Schalter muß ich umlegen?
-------------------------------------------------------------------------------------------------------------------
Hilf dir selbst, wenn dir geholfen werden soll!
ReadProcessMemory geht schon!
Wenn man die falsche "lpBaseAddress" hat sieht es manchmal so aus als ob es nicht
richtig funktioniert. Na gut Lehrgeld muß sein.
Die Lösung:
Fensterhandle mit "FindWindow" vom Programm besorgen welches die Ballonmessage sendet.
Mit einem globalem Hook prüfen, ob die Message "Ballonmeldung aktualisieren" kommt und mit
dem Fensterhandle abgleichen.
Nun kommt der schwierige Teil.
Die Adresse der Meldung finden. Dazu habe ich den gesamten Speicher der Anwendung durchsucht.
Kleines Programm macht das automatisch. (kann man den Wert nicht irgentwo abfragen?)
Zumindest bei meiner Testanwendung ist es immer dieselbe Adresse.
Text mit "ReadProcessMemory" auslesen, fertig.
Nun muß ich das Ganze nur noch auf meinen Anwendungsfall applizieren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!