![](https://images.cnblogs.com/cnblogs_com/xe2011/201205/201205301100368665.png)
////////////////////////////////////////////////////////////////////////////
(*
电脑上开了2个 窗口的名子都为Element Client如何处理 默认处理是 哪个窗口是激活的就读取哪个窗口
CE是通过 PID处理的
如何处理多进程游戏
*)
procedure DsplyRoleName();
//roleName=[[[[924E0C]+1C]+20]+5CC]+0//名称
//在Delphi中 用$加个地址 表示 这个地址它是16进制数的
Const
BaseAddress=$924E0C;
Offset1=$1C;
Offset2=$20;
RNOffset1=$5CC;
RNOffset2=$0;
var
MyHwnd:HWND;
MyPid:Dword;
MyProcess:Thandle;
MyPointer:Integer;
Readbyte:DWORD;//Size_T
RoleName:array [0..16] of WideChar;// UniCode 0..17个字符加起来共18个字符
(*
完美世界的人物名子最多可用9个汉字组成->18个字节(Bytes)
1个汉字=2个字节(Byte)
1个字节=1个英文字母
9个汉字=9*2(Bytes)=18(Bytes);
完美世界里使用的是Unicode字符,而我要是以字符串型显示出来的
UniCode类型的数据需要使用WideChar类型;
当人物的名子是由9个汉字组成的时候Char类型就会出乱码
*)
begin
MyHwnd:=FindWindow(NIL,'Element Client');
if myHwnd=0 then ShowMessage('No Found Element Client Window');
GetWindowThreadProcessId(MyHwnd,@myPid);
MyProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,myPid);
ReadProcessMemory(MyProcess,Pointer(BaseAddress),@MyPointer,4,Readbyte);
ReadProcessMemory(MyProcess,Pointer(MyPointer+Offset1),@MyPointer,4,Readbyte);
ReadProcessMemory(MyProcess,Pointer(MyPointer+Offset2),@MyPointer,4,Readbyte);
//把Unicode转换成ASCII
ReadProcessMemory(MyProcess,Pointer(MyPointer+RNOffset1),@MyPointer,4,Readbyte);
ReadProcessMemory(MyProcess,Pointer(MyPointer+RNOffset2),@RoleName,32,Readbyte);//20要读取的字节数
CloseHandle(MyProcess); //试用18不行 试19也不行,试20可行
//显示数值 //是上面16的2倍
FORM1.ComboBox1.Clear;
FORM1.ComboBox1.Text:=RoleName;
FORM1.ComboBox1.Items.Add(RoleName) ;
end;
procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
DsplyRoleName; //单击ComboBox小三角事件 OnDropDown
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.combobox1.Text:='';
form1.FormStyle:=fsStayOnTop;
DsplyRoleName;
end;
电脑上开了2个 窗口的名子都为Element Client如何处理 默认处理是 哪个窗口是激活的就读取哪个窗口
CE是通过 PID处理的
如何处理多进程游戏
*)
procedure DsplyRoleName();
//roleName=[[[[924E0C]+1C]+20]+5CC]+0//名称
//在Delphi中 用$加个地址 表示 这个地址它是16进制数的
Const
BaseAddress=$924E0C;
Offset1=$1C;
Offset2=$20;
RNOffset1=$5CC;
RNOffset2=$0;
var
MyHwnd:HWND;
MyPid:Dword;
MyProcess:Thandle;
MyPointer:Integer;
Readbyte:DWORD;//Size_T
RoleName:array [0..16] of WideChar;// UniCode 0..17个字符加起来共18个字符
(*
完美世界的人物名子最多可用9个汉字组成->18个字节(Bytes)
1个汉字=2个字节(Byte)
1个字节=1个英文字母
9个汉字=9*2(Bytes)=18(Bytes);
完美世界里使用的是Unicode字符,而我要是以字符串型显示出来的
UniCode类型的数据需要使用WideChar类型;
当人物的名子是由9个汉字组成的时候Char类型就会出乱码
*)
begin
MyHwnd:=FindWindow(NIL,'Element Client');
if myHwnd=0 then ShowMessage('No Found Element Client Window');
GetWindowThreadProcessId(MyHwnd,@myPid);
MyProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,myPid);
ReadProcessMemory(MyProcess,Pointer(BaseAddress),@MyPointer,4,Readbyte);
ReadProcessMemory(MyProcess,Pointer(MyPointer+Offset1),@MyPointer,4,Readbyte);
ReadProcessMemory(MyProcess,Pointer(MyPointer+Offset2),@MyPointer,4,Readbyte);
//把Unicode转换成ASCII
ReadProcessMemory(MyProcess,Pointer(MyPointer+RNOffset1),@MyPointer,4,Readbyte);
ReadProcessMemory(MyProcess,Pointer(MyPointer+RNOffset2),@RoleName,32,Readbyte);//20要读取的字节数
CloseHandle(MyProcess); //试用18不行 试19也不行,试20可行
//显示数值 //是上面16的2倍
FORM1.ComboBox1.Clear;
FORM1.ComboBox1.Text:=RoleName;
FORM1.ComboBox1.Items.Add(RoleName) ;
end;
procedure TForm1.ComboBox1DropDown(Sender: TObject);
begin
DsplyRoleName; //单击ComboBox小三角事件 OnDropDown
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.combobox1.Text:='';
form1.FormStyle:=fsStayOnTop;
DsplyRoleName;
end;
///////////////////////////////////
用龙龙内存遍历工具查找人物名称地址
![](https://images.cnblogs.com/cnblogs_com/xe2011/201205/201205301100403252.png)
用OD的特征码也能找到人物名子的地址