![](https://i-blog.csdnimg.cn/blog_migrate/50d45b019f3109cf5a6ce20ba408cf05.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://i-blog.csdnimg.cn/blog_migrate/232f886f1c29d10aecebea85a9243851.png)
用龙龙内存遍历工具查找人物名称地址
![](https://i-blog.csdnimg.cn/blog_migrate/b8fdf46579ace526ff45d6bbb1245d48.png)
用OD的特征码也能找到人物名子的地址
附件列表