Простой и эффективный способ работы с сообшениями чата напрямую в игре - это перехват функции которая эти самые сообшения в чате и размешает. Приведенный пример разукрашивает все сообшения в красный цвет.
Код:
...
var old_chat: procedure;
lib_NWindow: cardinal;
procedure do_chat(data: pointer); stdcall;
begin
cardinal(pointer(cardinal(data) + $0C)^) := $FF0000FF; // старший байт задает альфа канал
{по смешению 0х10 расположено значение определяюшее тип сообшения, к примеру сообшение в групповом чате имеет код 3, а голос героя - 17;
по смешению 0x08 находится указатель на сам текст сообшения (unicode) }
end;
procedure InterceptFuncChat; stdcall;
asm
push ebp
mov ebp, esp
pushad
push ebp
call do_chat
popad
pop ebp
push ebp // оригинальный загрузчик
mov ebp, [esp + 10h]
jmp old_chat
end;
...
var p: pointer;
OldProtect, lib: cardinal;
...
lib_NWindow := LoadLibrary('NWindow.dll');
lib := lib_NWindow + $52F40;
old_chat := pointer(lib + 5);
VirtualProtect(pointer(lib), 5, PAGE_EXECUTE_READWRITE, OldProtect);
addr := dword(@InterceptFuncChat) - lib - 5
p := pointer(lib);
byte(p^) := $e9;
dword(pointer(dword(p) + 1)^) := addr;
VirtualProtect(pointer(lib), 5, PAGE_EXECUTE_READWRITE, OldProtect);
... (c) puella