Hmm
Na razie chciałbym zrobić tylko taką prostą rzecz. Mianowicie zależy mi na odczytywaniu danych wartości z gry (w tym przypadku posłużę się Pinballem).
Znamy już heks odpowiedzialny za punkty (B7AEBA - jest stały).
Stworzyłem nowy projekt i dodałem 1 label, 1 timer, 1 button. Timer ustawiłem na enabled false. Po włączeniu go buttonem ten co 1000ms odświeża wartość punktów, które pokazuje label1.
Tak wygląda mój source:
unit Pinball_Bot;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
const
//adresy wartosci
Pinball_Punkty = $B7AEBA;
//koniec - adresy wartosci postaci
implementation
{$R *.dfm}
// Funkcje czytające
function ReadMemInteger(Address: Cardinal): Cardinal; //Read adress:value
var
ProcId: Cardinal;
tProc: THandle;
NBR: Cardinal;
value:integer;
begin
GetWindowThreadProcessId(FindWindow('PinballClient',Nil),@ProcId);
tProc:= OpenProcess(PROCESS_ALL_ACCESS, False, ProcId);
ReadProcessMemory(tProc, Ptr(Address), @value, 4, NBR);
CloseHandle(tProc);
Result:=value;
end;
function MemReadString(Address: Integer): String;
var
NB : LongWord;
Temp : ARRAY [1..255] OF Byte;
I : Byte;
IDProcess, proc_ID : Cardinal;
begin
GetWindowThreadProcessID(FindWindow('PinballClient', nil), @proc_ID);
IDProcess := OpenProcess(PROCESS_ALL_ACCESS, false, proc_ID);
Result := '';
ReadProcessMemory(IDProcess, Ptr(Address), @Temp[1], 255, NB);
for I := 1 to 255 do
begin
if ((Temp[i] = 0) or (Temp[i] = $0F)) then
Break;
Result := Result + Chr(Temp[i]);
end;
end;
// Koniec - Funkcje czytające
procedure TForm1.Timer1Timer(Sender: TObject);
begin
label1.Caption:=inttostr(ReadMeminteger(Pinball_Punkty));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
end;
end.
Problem jest w tym, że chociaż nie wyskakuje żaden błąd to wartość z label1 wariuje :/
Bardzo proszę o pomoc.