感謝E大的熱心的教學,看了E大的教學檔後,也寫出了一個自動補血和卡鍵掛,但是我發現一個問題,當我雙開時,如果把使用外掛的那個視窗縮小後,外掛就不會有動作,請問要如何修改才能使視窗縮小後也可動作和將遊戲視窗名稱改成角色的名字。
謝謝!努力學習中!
以下是我的源碼
var
Form1: TForm1;
Ghwnd : HWND; //視窗程式
ProcID: DWORD; //程序ID
ProcessID : DWORD; //遊戲
Dym_base : DWORD; //動態基址
Role_base: DWORD; //人物基址
Role_HP,Role_MaxHP : DWORD; //人物血量和最大血量
Role_MP,Role_MaxMP : DWORD; //人物真氣和最大真氣
TT : DWORD;
nkey1,nkey3,nkey5 : integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Ghwnd := FindWindow(nil, pchar(edit1.text)); //尋找視窗名稱
if Ghwnd = 0 then
begin
ShowMessage('無此視窗名稱');
end;
GetWindowThreadProcessId(Ghwnd, ProcID); //程序id
ProcessID := OpenProcess(PROCESS_ALL_ACCESS, False, ProcID); // 開啟程序
if ProcessID = 0 then //程序讀取失敗時
begin
showMessage('請先登入人物或檢查是否輸入名稱錯誤'); //跳出錯誤視窗
end;
if ProcessID>0 then //讀取成功時,讓所有外掛功能可以使用
begin
edit1.Enabled := False ; //讓填寫外掛名稱的欄位變灰
Timer1.Enabled :=True;
end;
end;
procedure TForm1.CheckBox5Click(Sender: TObject);
begin
if checkbox5.Checked then //當卡鍵功能勾選時
Begin
label27.Caption:=edit2.Text ; //標籤值(剩餘秒數)讀取為設定值
combobox9.Enabled:=false; //讓按鈕選項無法使用
edit2.Enabled:=false; //讓秒數設定欄無法使用
End
Else //當卡鍵功能取消勾選時
Begin
label27.Caption:='0'; //標籤值(剩餘秒數)恢復為0
combobox9.Enabled:=true; //讓按鈕選項可以再使用
edit2.Enabled:=true; //讓秒數設定欄可以再使用
End;
timer2.Enabled:=checkbox5.Checked ; //在勾選卡鍵功能時才開啟timer
end;
procedure TForm1.Edit2Change(Sender: TObject);
begin
try
strtofloat(edit2.Text);
checkbox5.Enabled:=true;
except
checkbox5.Enabled:=false;
End;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if combobox3.ItemIndex<9 then //按鈕定義
Nkey1:=$31+combobox3.ItemIndex //定義按鈕 1-9
Else
Nkey1:=112+combobox3.ItemIndex -9; //定義按鈕 F1~F8
if combobox4.ItemIndex<9 then //第二組按鈕
Nkey2:=$31+combobox4.ItemIndex
Else
Nkey2:=112+combobox4.ItemIndex -9;
if combobox9.ItemIndex<9 then //第五組按鈕
Nkey5:=$31+combobox9.ItemIndex
Else
Nkey5:=112+combobox9.ItemIndex -9;
ReadProcessMemory( ProcessID, pointer($A5BFB0+$1C),@Dym_base,4,TT );
ReadProcessMemory( ProcessID, pointer(Dym_base+$20),@Role_base,4,TT );
ReadProcessMemory( ProcessID, pointer(Role_base+$474),@Role_HP,4,TT );
ReadProcessMemory( ProcessID, pointer(Role_base+$4b4),@Role_MaxHP,4,TT );
ReadProcessMemory( ProcessID, pointer(Role_base+$478),@Role_MP,4,TT );
ReadProcessMemory( ProcessID, pointer(Role_base+$4b8),@Role_MaxMP,4,TT );
Label4.Caption :='HP'+IntToStr (Role_HP) +'/' + IntToStr (Role_MaxHP);
Label5.Caption :='MP'+IntToStr (Role_MP) +'/' + IntToStr (Role_MaxMP);
if checkbox1.Checked and (Role_HP*100/Role_MaxHP < strtoint(ComboBox1.Text)) then //假如勾選血魔保護,而且血魔%低於設定值時
SendMessageW (Ghwnd,WM_KEYDOWN ,nkey1,0); //發送鍵盤訊息
if checkbox3.Checked and (Role_MP*100/Role_MaxMP < strtoint(ComboBox6.Text)) then
SendMessageW (Ghwnd,WM_KEYDOWN ,nkey3,0);
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
label27.Caption :=floattostr((strtofloat(label27.Caption)*10-1)/10); //剩餘秒數,每次減少0.1
if strtofloat(label27.Caption)<=0 then //當標籤內數值(讀秒)減少到0時
SendMessageW (Ghwnd,WM_KEYDOWN ,Nkey5,0); //發送卡鍵訊息
if strtofloat(label27.Caption)<=0 then //當標籤內數值(讀秒)減少到0時
label27.Caption:=edit2.Text ; //將標籤值再回覆到設定秒數
end; |
|