- 注册时间
- 2011-3-10
- 最后登录
- 1970-1-1
该用户从未签到
|
发表于 2011-3-22 09:45:44
|
显示全部楼层
procedure TForm1.jiaxueTimer(Sender: TObject);
begin
hwd:=findwindow(nil,'Element Client');
if hwd<>0 then
begin
GetWindowThreadProcessId(hwd,pid);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @base, 4, num);//得到为人物基地址
ReadProcessMemory(hProcess,pointer(base + $254), @hp, 4, num); //得到生命值
if hp < strtoint(edit1.Text) then
begin
sendmessage(hwd,WM_KEYDOWN,VK_F1,0);
sendmessage(hwd,WM_KEYUP,VK_F1.HotKey,0);
delay(6000); //延时6秒,但是好像不管用,还是不停吃药,换成sleep可以,但是程序会假死,郁闷
end;
end;
end;
问题有几点如下
一
sendmessage(hwd,WM_KEYDOWN,VK_F1,0);
sendmessage(hwd,WM_KEYUP,VK_F1.HotKey,0);
你的这个VK_F1.HotKey是什么?这里应该就是VK_F1
你不停吃药的原因是sendmessage(hwd,WM_KEYDOWN,VK_F1,0);这里按下了,
sendmessage(hwd,WM_KEYUP,VK_F1.HotKey,0);但这里放开的不是VK_F1,所以是F1一直按下的原因
二,你这段代码本身就有问题,
你在每一次timer被处发的时候都会做如下的事
就是OpenProcess,这部分你完全可以放在外面,readprocessmemory只接收你的ProcessHandle就行了,这个OpenProcess的代码放到外面,程序运行一次做一次就行,不要在timer中执行.
三,
还有timer本身就是有延迟,你为啥要在timer里用延迟函数呢?
如果你要让你的代码延迟6秒你就把timer的Interval这个设置成6000把那个delay去掉......
因为你的delay不断的在调用Application.ProcessMessages它做让主线程的消息列队得到响应,所以,
当你的timer的Interval小于你的Delay中的参数时,那么刚一进延迟函数(delay)就会给主线程得到响应,这个时候主线程可能又收到你的 WM_TIMER消息,则又进入了Timer的函数,所以你要把delay去掉就让Timer去延迟,我已经把代码帮你改过.记得设置timer的 Interval
var
hProcess: DWORD; //这个可以使用全局变量
hwd: HWND;
procedure initProcess;
var
pid: DWORD;
begin
hwd:=findwindow(nil,'Element Client');
if hwn <> 0 then
begin
GetWindowThreadProcessId(hwd,pid);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);
end;
end;
procedure TForm1.jiaxueTimer(Sender: TObject);
begin
ReadProcessMemory(hProcess,pointer(address),@base, 4, num);
ReadProcessMemory(hProcess,pointer(base + $24), @base, 4, num);//得到为人物基地址
ReadProcessMemory(hProcess,pointer(base + $254), @hp, 4, num); //得到生命值
if hp < strtoint(edit1.Text) then
begin
sendmessage(hwd,WM_KEYDOWN,VK_F1,0);
sendmessage(hwd,WM_KEYUP,VK_F1,0);
end;
end;
end;
在窗口的OnCreate中或Button的OnClick调用initProcess
再窗口的Close中调用CloseHandle(hProcess); |
|