 |
Как прочесть игрового чата на Delphi XE8 - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
20.02.2016, 08:14
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 17.01.2011
 Сообщений: 1
 Популярность: -290
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
Как прочесть игрового чата на Delphi XE8
Доброе время суток, пытаюсь прочесть ировой чат по примеру
http://zhyk.ru/forum/showpost.php?p=4700627&postcount=5
нашел в теме оффсеты
 |
Цитата: |
 |
|
|
|
|
|
|
|
ChatStart = $00D75038
ChatEnd = $00D7503C
ChatMax = $00D75040
ChatNumber = $00D75044
InviteCount = $00D79C24 // Счетчик уведомлений
InviteStruct = $00D79C18 // Указатель на структуру уведомлений
+(i*$1C+$0) +$0 - InviteType, ASCII // Тип уведомления
+(i*$1C+$4) +$0 - InviteString, Unicode // Текст сообщения уведомления
+(i*$1C+$8) - InviteTimeout, dword // Время актуальности уведомления (мс)
+(i*$1C+$C) - InviteTimeStamp, dword // Временная метка
+(i*$1C+$10) - InviteWID, dword // WID персонажа, отправившего запрос
+(i*$1C+$14) - InviteID, dword // ID запроса пати/торга
i = 0..InviteCount-1 |
|
 |
|
 |
|
делаю так
 |
Цитата: |
 |
|
|
|
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
//~~~ Ищем окно Игры
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
function EnumProc (h: HWnd; Param: LongInt): Boolean; stdcall;
var
NoB: NativeUint;
p:array [0..255] of char;
WNik: array[0..255] of widechar;
lpBuffer,PID word;
Begin
GetClassName(h ,p,sizeof(p));
if p='ElementClient Window' then
begin
GetWindowThreadProcessId(h, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
if hProcess <> 0 then
begin
ReadProcessMemory (hProcess, Pointer(base_addr), @lpBuffer, sizeof(lpBuffer), NoB);
ReadProcessMemory (hProcess, Pointer(lpBuffer+$1C), @lpBuffer, sizeof(lpBuffer), NoB);
ReadProcessMemory (hProcess, Pointer(lpBuffer+$28), @lpBuffer, sizeof(lpBuffer), NoB);
ReadProcessMemory (hProcess, Pointer(lpBuffer+$6E8), @lpBuffer, sizeof(lpBuffer), NoB);
ReadProcessMemory (hProcess, Pointer(lpBuffer+StrToInt('$0')), @WNik, sizeof(WNik), NoB);
form1.sComboBox1.Items.Add(''+WNik+'');
akk[form1.sComboBox1.Items.Count-1].PID:=PID;
end;
closehandle(hProcess);
end;
EnumProc := TRUE;
end;
procedure TForm1.sComboBox1DropDown(Sender: TObject);
begin
scombobox1.Items.Clear;
EnumWindows (@EnumProc, 0);
end;
procedure TForm1.sSpeedButton2Click(Sender: TObject);
begin
begin
If sSpeedButton2.Tag=0 then
Begin
if (sComboBox1.Text='' )then
sLabel1.Visible:=True
else
begin
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, akk[scombobox1.ItemIndex].PID);
sSpeedButton2.Tag:=1;
sSpeedButton2.Caption:='√';
sComboBox1.Enabled:=false;
sSpeedButton2.Enabled:=True;
sLabel1.Visible:=False;
sSpeedButton2.Enabled:=true;
end
end
else
Begin
sSpeedButton2.Tag:=0;
sSpeedButton2.Caption:='+';
sComboBox1.Enabled:=True;
sSpeedButton2.Enabled:=true;
End;
end;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
//~~~ Конец окно Игры
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~
function ReadChat(Handle: THandle; ChatStartAddr,ChatNumberAddr: DWORD): string;
var s: string;
buf,Hprocess,start_addr,ChatLen,addr,PID: DWORD;
BytesCountOfRead: SIZE_T;//У кого то это тип DWORD
strNo,i: Integer;
str: array[0..255] of WideChar;
ch: char;
text: string;
st: TStringList;
begin
st:=TStringList.Create;
GetWindowThreadProcessId(handle,@pid);
hprocess:=OpenProcess(PROCESS_ALL_ACCESS,false,pid );
ReadProcessMemory(hprocess, ptr($00D75038), @start_addr, sizeof(start_addr), BytesCountOfRead);
ReadProcessMemory(hprocess, ptr($00D75044), @ChatLen, sizeof(ChatLen), BytesCountOfRead);
for strNo := 0 to ChatLen-1 do
begin
str[0] := #0;
i := 0;
try
ReadProcessMemory(hprocess, ptr(start_addr + ((StrNo * $1C) + $8)), @addr, sizeof(addr), BytesCountOfRead);
if addr <> 0 then
repeat
ReadProcessMemory(hprocess, ptr(addr), @ch, 2, BytesCountOfRead);
str[i] := ch;
addr := addr + 2;
inc(i);
until (ord(ch) = 0) or (i >=255);
except
end;
if i >= 1 then
str[i] := #0;
text:=str;
st.Add(text);
result:=st.Text;
end;
end;
procedure TForm1.sSpeedButton1Click(Sender: TObject);
begin
smemo1.Lines.Text:=ReadChat(hProcess,$00D75038,$00 D75044);
end;
end. |
|
 |
|
 |
|
но в итоге пустое поле в memo
может кто знает где проблема
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 11:01.
|
 |