熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#簡單游戲外掛制作(以WarcraftⅢ為例)

2013-11-13 10:09:40  來源: .NET編程 

  網上有很多外掛制作的教程大多是講針對大型網絡游戲的主要包含一些抓包反匯編C++的知識綜合事實也如此常見的外掛都是使用VC++寫的從來沒有過C#或者其他NET語言編寫的外掛

  作為微軟NET技術的忠實粉絲這難免是一種遺憾不過不要緊下面流牛木馬就教大家兩招包教包會免收學費

  其實作為游戲外掛來說主要就是三個功能模擬鍵盤操作模擬鼠標操作修改內存數據修改內存數據比較難但模擬鼠標鍵盤的操作卻很簡單很多流行游戲的外掛都可以只通過模擬鼠標鍵盤來實現例如勁舞團QQ音速連連看各類網頁游戲以及各類大型網游中的自動打怪自動吃藥等等

  Warcraft Ⅲ學名魔獸爭霸之冰封王座俗稱魔獸簡稱war在最近六七年風靡全球最近兩年war在中國又掀起了玩DOTA的新高潮

  本文制作DOTA游戲中的顯血改鍵外掛為例簡單地介紹如何使用C#語言制作游戲外掛

  最終界面如下

  

  本示例包含兩個功能顯血將Q鍵改為小鍵盤的玩war的同學都知道這兩個功能對於war(尤其是DOTA)相當重要

  首先簡單介紹一下外掛程序模擬鍵盤的原理

  外掛程序與游戲程序是兩個不同的進程外掛程序使用Windows提供的API找到游戲程序的進程並設置鍵盤鉤子(什麼叫做鉤子?你不知道但百度知道)設置完鉤子後我們再監控游戲進程中用戶的按鍵並根據用戶需求進行處理完成某些模擬鍵盤動作

  了解了這個過程之後我們就可以開始整理思路了完成外掛一共需要以下四個步驟

  一聲明Windows API 中的函數和常量

  //鍵盤Hook結構函數
    [StructLayout(LayoutKindSequential)]
    public class KeyBoardHookStruct
    {
      public int vkCode;
      public int scanCode;
      public int flags;
      public int time;
      public int dwExtraInfo;
    }
    #region DllImport
    //設置鉤子
    [DllImport(userdll CharSet = CharSetAuto CallingConvention = CallingConventionStdCall)]
    public static extern int SetWindowsHookEx(int idHook HookProc lpfn IntPtr hInstance int threadId);
    [DllImport(userdll CharSet = CharSetAuto CallingConvention = CallingConventionStdCall)]
    //抽掉鉤子
    public static extern bool UnhookWindowsHookEx(int idHook);
    [DllImport(userdll CharSet = CharSetAuto CallingConvention = CallingConventionStdCall)]
    //調用下一個鉤子
    public static extern int CallNextHookEx(int idHook int nCode IntPtr wParam IntPtr lParam);
    //取得模塊句柄 
    [DllImport(kerneldll CharSet = CharSetAuto CallingConvention = CallingConventionStdCall)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

  //尋找目標進程窗口

  [DllImport(USERDLL)]
    public static extern IntPtr FindWindow(string lpClassName
      string lpWindowName);
     //設置進程窗口到最前 

  [DllImport(USERDLL)]
    public static extern bool SetForegroundWindow(IntPtr hWnd);
    //模擬鍵盤事件 

  [DllImport(Userdll)]
    public static extern void keybd_event(Byte bVk Byte bScan Int dwFlags Int dwExtraInfo);

  //釋放按鍵的常量
  private const int KEYEVENTF_KEYUP =;

  本例所使用的函數比較少它們都在系統的USERdll裡包括設置和取消鉤子調用下一個鉤子導入進程模擬鍵盤等等我們依次導入它們

  這些函數的命名規范合理幾乎只根據函數名就能知道其功能

  如果讀者對於其中的某些函數不熟悉請自行搜索MSDN

  二使用Windows API設置鉤子

  有了以上windows API函數的聲明下一步就是設置鉤子了

  寥寥兩行代碼但包含了相當豐富的內容

  //委托
public delegate int HookProc(int nCode IntPtr wParam IntPtr lParam);

  

  public void Hook_Start()
  {
    // 安裝鍵盤鉤子
    if (hHook == )
    {
      KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

  hHook = SetWindowsHookEx(WH_KEYBOARD_LL KeyBoardHookProcedure GetModuleHandle(ProcessGetCurrentProcess()MainModuleModuleName) );
           
    }
  }

  

  先介紹一下設置鉤子的明星函數SetWindowsHookEx 它的參數說明如下

    SetWindowsHookEx(

  idHook Integer   {鉤子類型}

  lpfn TFNHookProc {函數指針}

  hmod HINST       {包含鉤子函數的模塊(EXEDLL)句柄 一般是 HInstance 如果是當前線程這裡可以是 }

  dwThreadId DWORD  {關聯的線程 可用 GetCurrentThreadId 獲取當前線程 表示是系統級鉤子}

  ) HHOOK            {返回鉤子的句柄 表示失敗}

  請注意lpfn這個參數上面的解釋是函數指針在C#中是不能直接使用指針的更不要說函數指針了我們可以采用C#中的委托(delegate)來實現函數指針的功能

  於是乎在上面的代碼中我們定義了一個處理鍵盤消息函數的委托KeyBoardHookProcedure = new HookProc(KeyBoardHookProc)並將它作為參數傳入SetWindowsHookEx 內KeyBoardHookProc就是被委托的具體函數

  三監控用戶操作

  設置好鉤子後我們可以在被委托的函數中寫入監控用戶操作與模擬鍵盤的代碼

  public static int KeyBoardHookProc(int nCode IntPtr wParam IntPtr lParam)
    {
    //監控用戶鍵盤輸入

  KeyBoardHookStruct input = (KeyBoardHookStruct)MarshalPtrToStructure(lParam typeof(KeyBoardHookStruct));

  //截獲Home 鍵     

  if (inputvkCode == (int)KeysHome)
      {
       //此處寫入其他操作邏輯        

  }
    
      // 繼續執行下一個鉤子程序
      return CallNextHookEx(hHook nCode wParam lParam);

  }

    四根據用戶需要模擬鍵盤操作

  顯血功能玩war的都知道war自帶的顯血快捷鍵有Alt鍵是顯示所有單位生命[ 鍵顯示友方單位生命] 鍵顯示地方單位生命外掛需要做的事情僅僅是模擬一直按著某個鍵不松手而已由於Alt鍵與其他很多鍵構成組合鍵故我們不能模擬長按Alt否則會影響正常游戲我們的解決方案應該是模擬長按 [ 鍵和 ] 鍵代碼如下

  //獲得魔獸程序的句柄
        IntPtr wcHandle = FindWindow(null Warcraft III);

  //如果鉤子有效
        if (wcHandle != IntPtrZero)
        {
          //設置游戲窗口到最前
          SetForegroundWindow(wcHandle);

  byte VK_NUM = ;  //鍵盤上 [ 鍵的代碼按[可顯示友方單位生命值
         byte VK_NUM = ;  // 鍵盤上] 鍵的代碼按]可顯示敵方單位生命值
         keybd_event(VK_NUM   ); //長按[
        keybd_event(VK_NUM   ); //長按]

  }

    改鍵 小鍵盤(Numpad)上的快捷鍵很不方便按所以很多玩家喜歡把小鍵盤上的鍵改到左邊的字母鍵盤玩DOTA的同學都知道沒有任何英雄的技能使用Q這個快捷鍵(召喚師有一種球是Q(不是技能))於是我們把小鍵盤上的鍵改到Q上也不會造成任何沖突方法也很簡單如果監控到用戶按Q則像游戲進程發送小鍵盤上的代碼如下

  //如果用戶按了Q鍵
     if (inputvkCode == (int)KeysQ)
     {
       //獲得魔獸程序的句柄
       IntPtr wcHandle = FindWindow(null Warcraft III);

  //如果鉤子有效
       if (wcHandle != IntPtrZero)
       {
         //設置游戲窗口到最前
         SetForegroundWindow(wcHandle);
         byte VK_Q = (byte)KeysNumPad;
         keybd_event(VK_Q   );//按下小鍵盤
         keybd_event(VK_Q  KEYEVENTF_KEYUP ); //松開小鍵盤
       }
       return ;
     }

    好了到這裡就把模擬鍵盤的外掛介紹完了模擬鼠標與之非常類似請用戶自行揣摩


From:http://tw.wingwit.com/Article/program/net/201311/12753.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.