📄 源码.txt
字号:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls,Math;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Button1: TButton;
Label17: TLabel;
Label18: TLabel;
ListView1: TListView;
GroupBox2: TGroupBox;
Button2: TButton;
Button3: TButton;
ListView2: TListView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
aatom:atom;
end;
var
Form1: TForm1;
ProcessID: Thandle;
ProcID: Thandle;
Ghwnd: Thandle;
Ecxi,Ecxg: Cardinal;
mytime:integer;
r_level,r_hp,r_maxhp,r_mp,r_maxmp,r_dq,r_money,g_N,g_MAX,g_StartAdd,pn,gEax,g_level,g_ID,r_Maxexp1:Cardinal;
r_exp,r_Maxexp:double;
r_Name,g_Name:array[0..16] of WideChar;
r_Name1,g_Name1:integer;
r_X,r_Y,rg_Local:single;
const Baseadr = $0097D558; //一级基址
implementation
{$R *.dfm}
procedure GetLook;//刷新
var
Num: Cardinal;
MinLocalID:integer;
MaxLocal:integer;
begin
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID);
ReadProcessMemory(ProcessID, Pointer(Baseadr), @ECXI, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $208), @r_Maxexp1, 4, Num);
ReadProcessMemory(ProcessID, Pointer(r_Maxexp1 + $8), @r_Maxexp1, 4, Num);
ReadProcessMemory(ProcessID, Pointer(r_Maxexp1 + $64), @r_Maxexp, 8, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $1C), @ECXI, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $24), @ECXI, 4, Num);//ECXI具体值
ReadProcessMemory(ProcessID, Pointer(ECXI + $42C), @r_Name1, 12, Num);
ReadProcessMemory(ProcessID, Pointer(r_Name1), @r_Name, 20, Num);//角色名字
ReadProcessMemory(ProcessID, Pointer(ECXI + $290), @r_level, 4, Num);// 人物等级
ReadProcessMemory(ProcessID, Pointer(ECXI + $2AC), @r_HP, 4, Num);//当前血
ReadProcessMemory(ProcessID, Pointer(ECXI + $2CC), @r_MAXHP, 4, Num);//最大血
ReadProcessMemory(ProcessID, Pointer(ECXI + $2B4), @r_mp, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXI + $2B0), @r_dq, 4, Num);//当前斗气
ReadProcessMemory(ProcessID, Pointer(ECXI + $2A4), @r_exp, 8, Num); //经验
ReadProcessMemory(ProcessID, Pointer(ECXI + $3C), @r_X, 4, Num);//x
ReadProcessMemory(ProcessID, Pointer(ECXI + $44), @r_Y, 4, Num);//y
ReadProcessMemory(ProcessID, Pointer(ECXI + $340), @r_Money, 4, Num);//钱
//怪物列表
ReadProcessMemory(ProcessID, Pointer(Baseadr), @ECXG, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXG + $1C), @ECXG, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXG + $8), @ECXG, 4, Num);
ReadProcessMemory(ProcessID, Pointer(ECXG + $20), @ECXG, 4, Num);//ECXG具体值
ReadProcessMemory(ProcessID, Pointer(ECXG + $14), @g_N, 4, Num);//当前怪物数量
ReadProcessMemory(ProcessID, Pointer(ECXG + $24), @g_max, 4, Num);//数组最大值
ReadProcessMemory(ProcessID, Pointer(ECXG + $18), @g_startadd, 4, Num);//怪列表首地址
for pn := 0 to g_Max do
begin
ReadProcessMemory(ProcessID, Pointer(g_startadd + 4 * pn), @gEax, 4, Num);
if gEax > 0 then
begin
ReadProcessMemory(ProcessID, Pointer(gEax + $4), @gEax, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $12C), @g_ID, 4, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $1A4), @g_name1, 4, Num);
ReadProcessMemory(ProcessID, Pointer(g_name1), @g_name, 20, Num);
ReadProcessMemory(ProcessID, Pointer(gEax + $134), @g_level, 4, Num); //等级
ReadProcessMemory(ProcessID, Pointer(gEax + $1DC), @rg_Local, 4, Num); //距离
//ReadProcessMemory(ProcessID, Pointer(gEax + $3C), @g_X, 4, Num);
//ReadProcessMemory(ProcessID, Pointer(gEax + $44), @g_Y, 4, Num);
//
{if rg_Local < 10 then
begin
ReadProcessMemory(ProcessID, Pointer(gEax + $208), @pgName, 4, Num); //名称
ReadProcessMemory(ProcessID, Pointer(pgName), @gName, 32, Num);
tgName := gName;
lstGname.Items.Add(tgName + ' ' + inttostr(floor(rg_Local)));
lstGID.Items.Add(inttostr(g_id));
LabGNS.Caption := inttostr(lstGID.Items.Count);
end;}
MaxLocal:=100;
if floor(rg_Local)<MaxLocal then
begin
MinLocalID:= g_ID;
MaxLocal:= floor(rg_Local);
end;
with form1.listview1.items.add do
begin
caption:=g_name;
subitems.add(inttostr(g_Level));
end;
end;
end;
form1.Label2.Caption := r_Name;
form1.Label4.Caption := inttostr(r_level);
form1.Label6.Caption := inttostr(r_HP)+'/'+inttostr(r_MAXHP);
form1.Label8.Caption := inttostr(r_MP)+'/100';
form1.Label10.Caption := inttostr(r_dq)+'/100';
form1.Label12.Caption := floatToStr(r_exp)+'/'+floatToStr(r_Maxexp);
form1.Label14.Caption := inttostr(floor(r_X))+','+inttostr(floor(r_Y));
form1.Label18.Caption := inttostr(g_N);
form1.Label16.Caption := inttostr(floor(r_Money / 10000)) + '金 ' + inttostr(floor((r_Money Mod 10000) / 100)) + '银 ' + inttostr(floor(r_Money Mod 100)) + '铜';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Ghwnd := FindWindow('ChiBiElementClient Window', 0); //获取窗口
if Ghwnd = 0 then
begin
ShowMessage('游戏未启动');
Application.Terminate();
end;
GetWindowThreadProcessId(Ghwnd, ProcID); //进程ID
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID); // 进程句柄
if ProcessID = 0 then
begin
showMessage('无法打开线程');
Application.Terminate();
end;
CloseHandle(ProcessID); //关闭进程句柄
GetLook;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
form1.listview1.Clear ;
GetLook;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
with listview2.items.add do
begin
caption:=listView1.Selected.Caption;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
i:integer;
begin
For i:=0 to ListView2.Items.Count-1 Do
If ListView2.Items[i].Selected then
begin
ListView2.Items.Delete(i); //删除当前选中行
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -