黃易群俠傳M脫機外掛應用程式黃易神行
14588
27

[發問] 請問efun大或會Delphi的高手

MOULI33 發表於 2010-11-10 08:46:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |
感謝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;
收藏收藏 分享分享 讚 幹 分享分享 FB分享
回覆

使用道具 舉報


efun 當前離線
UID
226745
熱心
683 值
嘉獎
6 次
違規
0 次
在線時間
1229 小時
經驗
812 點
積分
472147
精華
6
最後登錄
2021-5-1
閱讀權限
70
註冊時間
2007-2-19
論壇幣
469294 幣
聯合幣
59 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 5Rank: 5Rank: 5
efun 2010-11-12 00:24:05
本帖最後由 efun 於 2010-11-12 00:45 編輯

1.完美在後台狀態下會屏蔽 模擬按鍵,所以雙開下,縮起來的視窗會無作用
解決方法: 按鍵CALL,破解 後台模擬按鍵 限制,直接CALL功能,發包....

2. SetWindowText
回覆

使用道具 舉報

kuanhouin 該用戶已被刪除
kuanhouin 2010-11-12 00:31:14
提示: 作者被禁止或刪除 內容自動屏蔽
回覆

使用道具 舉報

jinnrose 當前離線
UID
896933
熱心
49 值
嘉獎
0 次
違規
0 次
在線時間
79 小時
經驗
39 點
積分
167
精華
0
最後登錄
2015-7-6
閱讀權限
20
註冊時間
2008-6-19
論壇幣
8171 幣
聯合幣
9 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
jinnrose 2010-11-12 01:39:24
ReadProcessMemory(Ggame,pointer(ft+$618), @UnName, 4, tt);
ReadProcessMemory(Ggame,pointer(UniName), @ASName, 36, tt);
idName:= WideCharToString(ASName);
label1.Caption:='人物名稱:'+ASName;
即可顯示出人物在遊戲中的名稱


由於完美裡面的國字是uniceode碼,所以找到人物名稱徧移捉到的資料,是uniceode碼
所以要把Unicode轉成ASCII碼
函數WideCharToString 把uniceode字串轉換為多位元組字元字串

再配合e大所提   SetWindowText 的語法運用,即可以把遊戲視的標題'完美世界前傳'
置換為現行的人物名稱


後話...自丁丁不再對外公開...本人也只有拚老命戴起老花眼鏡,利用每天晚一,二個小時找資料
畢竟要十多年沒再寫程式囉YCT48B

呵.現在網路真方便,要什在上面找都有哩,找著找著心裡感慨為何都是在大陸網站,而且玩家還很熱烈討
論程序及函數相關技巧,而這裡好像只有e大在撐著教學,呵....

所以...
回覆

使用道具 舉報

MOULI33 當前離線
UID
1279460
熱心
59 值
嘉獎
0 次
違規
0 次
在線時間
72 小時
經驗
58 點
積分
58
精華
0
最後登錄
2014-6-23
閱讀權限
20
註冊時間
2009-7-29
論壇幣
6361 幣
聯合幣
1 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
5
MOULI33 2010-11-12 08:15:13
謝謝E大和jinnrose大的解答
另外再請問一下call的語法要如何寫,網路上找到的資料有些看不懂!
謝謝!




1# MOULI33
回覆

使用道具 舉報

janin0115 當前離線
UID
1472623
熱心
200 值
嘉獎
0 次
違規
0 次
在線時間
269 小時
經驗
120 點
積分
927
精華
0
最後登錄
2015-10-26
閱讀權限
30
註冊時間
2010-5-31
論壇幣
318 幣
聯合幣
3 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 4Rank: 4
6
janin0115 2010-12-8 00:18:49
ReadProcessMemory(Ggame,pointer(ft+$618), @UnName, 4, tt);
ReadProcessMemory(Ggame,pointer(UniName), @ASName, 36, tt);
idName:= WideCharToString(ASName);
label1.Caption:='人物名稱:'+ASName;

請問j大
我執行的時候 錯誤在(ASName)
( )上 請問要怎麼解決 初學請見諒 還是要定義什麼   謝謝
回覆

使用道具 舉報

jinnrose 當前離線
UID
896933
熱心
49 值
嘉獎
0 次
違規
0 次
在線時間
79 小時
經驗
39 點
積分
167
精華
0
最後登錄
2015-7-6
閱讀權限
20
註冊時間
2008-6-19
論壇幣
8171 幣
聯合幣
9 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
7
jinnrose 2010-12-8 01:25:40
var //變數部份

UnicodeName:dword ; //unicode名
ASCIIname: array [0..35] of WideChar; //9個國字=18Byte=36bytes所以0..35一共36這個字符


程序部份
ReadProcessMemory(Ggame,pointer(ft+$618), @UnName, 4, tt);
ReadProcessMemory(Ggame,pointer(UniName), @ASName, 36, tt);
WideCharToString(ASName);  //把變數中的unicod碼資料轉換為ASCII碼
label1.Caption:='人物名稱:'+ASName;

SetWindowText(ghwnd,Pchar(ASName)); //加上這一行就可以.把視窗名置換人物名稱囉

這樣就可以囉...主要是變數型態上的宣告沒作吧! 順便提供另一種寫法,

ReadProcessMemory(GAME,Pointer(ft+$618),@UnName,4,tt); //人物名稱指標
  ReadProcessMemory(GAME,pointer(UnName),@ASName,SizeOf(ASName), tt);//讀取人物名稱
Label1.Caption := '人物名稱:' + string(ASName);

這樣子可以少一行,精簡程序


ps..efun學有專精才能稱大...我也是才剛學,不用稱大...老到是可以承受..是有點老了...呵呵
      
   加油囉..小兄弟
回覆

使用道具 舉報

RAINTCK 當前離線
UID
1569638
熱心
259 值
嘉獎
0 次
違規
0 次
在線時間
321 小時
經驗
158 點
積分
4295
精華
0
最後登錄
2018-10-27
閱讀權限
50
註冊時間
2010-10-21
論壇幣
3504 幣
聯合幣
47 枚
幸運鑽
6 顆
招待卷
2000 點
查看詳細資料
Rank: 6Rank: 6
8
RAINTCK 2010-12-8 13:04:22
6# janin0115

也可以這樣,我是這樣寫
READPROCESSMEMORY(GAMES,Pointer(base_addr + $1C), @MOTION_BASE_ADDR, 4, PP);  // 完美一級基址
  READPROCESSMEMORY(GAMES,Pointer(MOTION_BASE_ADDR+$20),@FIGURE_BASE_ADDR,4,PP); // 人物基址偏移
  READPROCESSMEMORY(GAMES,Pointer(FIGURE_BASE_ADDR+$618),@FIGURE_NAME_ADD,4, PP); // 人物ID偏移
  READPROCESSMEMORY(GAMES,Pointer(FIGURE_BASE_ADDR+$620),@FIGURE_BUS,4, PP);// 讀取人物職業
  READPROCESSMEMORY(GAMES,Pointer(FIGURE_NAME_ADD),@(FIGURE_NAME),32,pp); // 讀取人物名
直接把讀取位元定一個數,一個中文2個ASCII碼遊戲人名最大中文數*2
看j大的自我介紹YCT17B我們大概是同時期的
我從8088開始接觸
回覆

使用道具 舉報

jinnrose 當前離線
UID
896933
熱心
49 值
嘉獎
0 次
違規
0 次
在線時間
79 小時
經驗
39 點
積分
167
精華
0
最後登錄
2015-7-6
閱讀權限
20
註冊時間
2008-6-19
論壇幣
8171 幣
聯合幣
9 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 2Rank: 2
9
jinnrose 2010-12-10 10:06:19
8088   ...好遙遠的記憶YCT42B

呵..不就要叫你同學了..CCC
PE2寫程式感覺和現在完全不一樣.......
回覆

使用道具 舉報

RAINTCK 當前離線
UID
1569638
熱心
259 值
嘉獎
0 次
違規
0 次
在線時間
321 小時
經驗
158 點
積分
4295
精華
0
最後登錄
2018-10-27
閱讀權限
50
註冊時間
2010-10-21
論壇幣
3504 幣
聯合幣
47 枚
幸運鑽
6 顆
招待卷
2000 點
查看詳細資料
Rank: 6Rank: 6
10
RAINTCK 2010-12-10 10:14:50
PE2寫程式YCT13B GOTO來GOTO去的抓蟲可以抓一天
跟你一樣十幾年沒寫程式了YCT66B
因為丁丁不放了只好每天下班東抓一點資料西抓一點資料的YCT57B
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

123下一頁

手機版 | Archiver | 外掛聯合國

GMT+8, 2024-11-25 12:01 , Processed in 0.053300 second(s), 18 queries , Memcache On.

版權說明:
  本站不會製作、經銷、代理外掛程式。僅免費提供外掛程式下載前之掃毒及掃木馬等安全檢測驗證,協助會員遠離盜號危險程式。本站所有資料均來自網際網路收集整理,說明文字暨下載連結轉載自原程 式開發站。站上出現之公司名稱、遊戲名稱、程式等,商標及著作權,均歸各公司及程式原創所有,本站程式所有權歸外掛聯合國所有。本程式所有權歸外掛聯合國所有.......

回頂部
第二步?
第三步?