看流星社区

 找回密码
 注册账号
查看: 2582|回复: 4

[Delphi] 第一次用D写程序,最简单的读取血量,竟然失败。。。求高手帮忙看看哪儿不对

[复制链接]

该用户从未签到

发表于 2011-4-1 14:58:02 | 显示全部楼层 |阅读模式
var
  Form1: TForm1;
  Gameh:hwnd;                  //游戏窗口句柄
  GamePid:Thandle;             //进程ID
  GamehProcess:Thandle;        //进程句柄
const  //常量
  GameCaption= '诛仙2';
  GameBase=$00b269bc;
implementation
{$R *.dfm}
function GetRoleBase:integer;
var
  ptmp:integer;
  readByte:Dword;
begin
  result:=0;
  Gameh:=FindWindow(nil,GameCaption);
  GetWindowThreadProcessID(Gameh,GamePid);
  GamehProcess:=OpenProcess(windows.PROCESS_ALL_ACCESS,false,GamePid);
  ReadProcessMemory(Gamehprocess,Pointer(GameBase+$1c),@ptmp,4,readByte);
   ReadProcessMemory(Gamehprocess,Pointer(ptmp+$28),@ptmp,4,readByte);
result:=ptmp;
end;

function GetCurBlood:integer;
var
  Base:integer;
  ptmp:integer;
  readByte:Dword;
begin
  Base:=GetRoleBase;
  ReadProcessMemory(Gamehprocess,Pointer(Base+$270),@ptmp,4,readByte);
  result:=ptmp;
  end;
procedure TForm1.Timer1Timer(Sender: TObject);

begin
self.Label3.Caption:=intTostr(GetCurBlood);
end;

end.

运行程序,竟然Label3直接读出数值,游戏都还没开

这段代码是照着郁金香D教程写的,不知道看视频的时候是不是漏了什么。

该用户从未签到

发表于 2011-4-1 14:58:29 | 显示全部楼层
加上判断游戏是否打开在读取数值

该用户从未签到

 楼主| 发表于 2011-4-1 14:58:45 | 显示全部楼层
加了
if  Gameh=0  then  form1.Close;
之后

不开游戏,程序退出,没问题。

打开游戏,读取数值,依旧是原来不开游戏读取到的那数值。。。

该用户从未签到

 楼主| 发表于 2011-4-1 14:58:51 | 显示全部楼层
有诛仙的朋友麻烦帮莪试试,是程序问题,还是莪这里Delphi安装的时候出问题了

该用户从未签到

 楼主| 发表于 2011-4-1 15:00:47 | 显示全部楼层
不确定。。。因为不开游戏,程序一样能运行,还能读出数值。。。

更诡异的是,莪一移动程序窗口,那数值还会改变。。。

以上代码完全模仿教程写的,应该不会有错。

GameBase=$00b269bc;   

将基址赋给GameBase

ReadProcessMemory(Gamehprocess,Pointer(GameBase+$1c),@ptmp,4,readByte);  

将基址+1C偏移,赋给ptmp

这应该没问题吧。难道Delphi里的逻辑不是这样?

莪只懂VB。看过Delphi正规教程里不教读取偏移之类的东西。。。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-20 00:22

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表