Hi Leute,
ihr kennt doch sicherlich alle die Windows Messages die mit SendMessage(hwnd, msg, wparam, lparam) verschickt werden. Die beste IPC Methode ist ja, so denke ich doch, das Windows-Message-System. Ich habe eine eigene Art TSO(Teamspeak-Overlay) geschrieben, dass noch etwas mehr macht als das Original.
Für die, die TSO nicht kennen:
Teamspeak ist ein Programm das für Voice-Chat verwendet wird. Es gibt eine Chatroom Hierarchie und Admins und Channel-Admins wie in einem richtigen Chat. Das besondere an diesem Voice-Chat ist, dass er durch seine starken Voiceencoder den Datenstrom so klein hält, dass es die Latenzzeiten von Computerspielen recht gering hält und damit eine gutes "lagfrei" gameplay bietet. Oftmals sind aber soviele Leute in den Channels, dass man diese meiste an der Stimme nicht mehr indentifizieren kann. Da man nicht immer das Spiel minimieren kann und nachzugucken wer da gerade mit einem spricht wurde TSO entwickelt. Dieses Programm klinkt sich in den Frame-Render-Prozess des Spiels ein und zeichnet bevor die Frame aus dem Backbuffer auf den Schirm kommt noch schnell ein Fenster mit den Usernamen der Leute die gerade im Teamspeak sprechen. Man sieht also immer im Spiel wer gerade spricht.
Mein TSO zeigt noch etwas mehr an als nur die User die da gerade sprechen und diese Informatinen müssen irgendwie übergeben werden (IPC).
Der Kern von TSO ist eine DLL die per Injection dem Gameprozess hinzugefügt wird.
Ich muss also mit dieser DLL kommunizieren. Ein intervallgesteurte Shared-Memory abgfrage ist sehr CPU-lastig,d aher möchte ich ein Siganl über Sendmessage an den Spielprozess schicken. Meine DLL soll diese Nachricht abfangen bevor sie an das eigentliche Spiel weitergeleitet wird.
Ich denke mal das Stichwort dafür sind "Hooks".
Jedes mal jedoch wenn ich einen WH_GETMESSAGE in einer DLL startete, hookt der sämtliche Prozesse.
Ich möchte jedoch nur die Windows-MEssages hooken die das Spiel bekommt.
Hier ein Ausschnitt aus der Hook-DLL
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| var phook : integer;
function HookProc(nCode:Integer; wparam:WPARAM; lparam:LPARAM):HRESULT;stdcall; begin result := CallNextHookEx(phook, nCode, wparam, lparam);
end; procedure InstallHook; begin phook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, HInstance, 0); end; procedure DLLMain(reason:Integer); begin if reason = DLL_PROCESS_ATTACH then begin Showmessage('hook installiert'); end;
if reason = DLL_PROCESS_DETACH then begin Showmessage('hook entfernt'); end; end; begin DllProc := @DllMain; DllMain(DLL_PROCESS_ATTACH); end. |
Sobald diese DLL eingeladen wird bekomme ich aus Zeile 23 eine Messagebox von jedem laufenden Prozess. Obwohl ich diese DLL nur in einen Prozess eingeplanzt habe.
Frage:
Wie Hooke ich nur einen Prozess?
Ist WH_GETMESSAGE der richtige Hook um SendMessage(a,b,c,d) abzufangen?
Mit freundlichen Grüßen
Tobi