CODE Unicode roleName_字符类型数据 人物名子

 
 
////////////////////////////////////////////////////////////////////////////

(* 
电脑上开了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;
 
 
///////////////////////////////////
用龙龙内存遍历工具查找人物名称地址
用OD的特征码也能找到人物名子的地址
 





附件列表

 

posted @ 2012-05-30 11:01  XE2011  阅读(445)  评论(1编辑  收藏  举报