📄 usearch.pas
字号:
{*******************************************************}
{ }
{ 目标进程搜索单元 }
{ }
{ 主要搜索人物的各种属性及状态 }
{ }
{*******************************************************}
unit uSearch;
interface
uses
Windows, Classes, SysUtils;
type
TThreadSearch = class(TThread)
private
Found: Boolean;
{ Private declarations }
public
protected
procedure Execute; override;
procedure UpdateChrName;
procedure UpdateForm;
end;
var
ThreadSearch: TThreadSearch;
GameBaseAddr: DWORD;
implementation
uses uDefine, fmMain;
{ TThreadSearch }
procedure TThreadSearch.Execute;
var
pid: Cardinal;
pProc: Cardinal;
pPos: PDWORD;
pStr: PChar;
baseAddr, readok: DWORD;
vBuffer: array[0..255] of Char;
mem: TMemoryStream;
pGameChr: PGameChrProp;
begin
while not Terminated do
begin
Sleep(599);
GameChr.ZtHwnd := FindWindow(@GameChr.ztClassName[1], nil);
if GameChr.ZtHwnd = 0 then
begin
GameChr.ClearProp; //为负数表示找不到征途窗口
Synchronize(UpdateForm);
Suspend; //挂起搜索线程
Continue;
end;
try
GetWindowThreadProcessId(GameChr.ZtHwnd, @pid);
pProc := OpenProcess(PROCESS_VM_READ, False, pid);
mem := TMemoryStream.Create;
try
// mem.Clear;
// mem.SetSize(40);
GameBaseAddr := GameChr.BaseAddr - 4;
// baseAddr :=$280FC86-4;// $143010;
// ReadProcessMemory(pProc, Pointer(baseAddr), mem.Memory, 40, readok);
// pStr := mem.Memory;
// GameChr.MapName := string(pStr);
// mem.Clear;
// mem.SetSize(8);
// baseAddr := GameBaseAddr - $85A; //坐标地址
// ReadProcessMemory(pProc, Pointer(baseAddr), mem.Memory, 8, readok);
// pPos := mem.Memory;
// if pPos^ > 999 then
// GameChr.PosName := '000:000'
// else
// begin
// GameChr.PosName := IntToStr(Word(pPos^));
// inc(pPos);
// GameChr.PosName := GameChr.PosName + ':' + IntToStr(Word(pPos^));
// end;
if GameChr.NeedSearchName then
begin
GameChr.NeedSearchName := False;
mem.clear;
mem.SetSize(32);
baseAddr := GameBaseAddr - $4CA - 4; //姓名地址
ReadProcessMemory(pProc, Pointer(baseAddr), mem.Memory, 32, readok);
pStr := mem.Memory;
GameChr.ChrName := string(pStr);
// mem.SaveToFile('d:\zt.txt');
Synchronize(UpdateChrName);
end;
mem.clear;
mem.SetSize(80);
baseAddr := GameBaseAddr;
ReadProcessMemory(pProc, Pointer(baseAddr), mem.Memory, 80, readok);
pGameChr := mem.Memory;
GameChr.ChrProp := pGameChr^; //保存搜索到的属性
pGameChr := nil;
finally
VirtualFreeEx(pProc, Pointer(GameBaseAddr), 0, MEM_RELEASE);
CloseHandle(pProc);
mem.Free;
end;
except
end;
Synchronize(UpdateForm);
end;
end;
procedure TThreadSearch.UpdateChrName;
begin
if not Assigned(frmMain) then
Exit;
with frmMain do
begin
edtChrName.Text := GameChr.ChrName;
SetTitle(GameChr.ChrName);
GetChrSetting;
tryIco.Hint:=GameChr.ChrName;
end;
end;
procedure TThreadSearch.UpdateForm;
begin
if not Assigned(frmMain) then
Exit;
with frmMain,GameChr.ChrProp do
begin
if (MaxHp > 0) and (HP <=MaxHp) then
begin
gHp.MaxValue := MaxHp;
gHp.Progress := Hp;
end;
if (MaxMp > 0) and (Mp <= MaxMp) then
begin
gMp.MaxValue := MaxMp;
gMp.Progress := Mp;
end;
lblHp.Caption := Format('%5d /%5d', [Hp, MaxHp]);
lblMp.Caption := Format('%5d /%5d', [Mp, MaxMp]);
end;
end;
initialization
ThreadSearch := TThreadSearch.Create(True);
finalization
ThreadSearch.Terminate;
ThreadSearch.Free;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -