c#調用windows api C#簡單遊戲外掛製作(以Warcraft Ⅲ為例)

來源:互聯網
上載者:User
C#簡單遊戲外掛製作(以Warcraft Ⅲ為例)

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

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

    其實作為遊戲外掛來說,主要就是三個功能:類比鍵盤操作、類比滑鼠操作、修改記憶體資料。修改記憶體資料比較難,但類比滑鼠鍵盤的操作卻很簡單。很多流行遊戲的外掛,都可以只通過類比滑鼠鍵盤來實現,例如:勁舞團、QQ音速、連連看、各類網頁遊戲,以及各類大型網遊中的自動打怪、自動吃藥等等。

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

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

    最終介面如下:

    本樣本包含兩個功能:顯血;將Q鍵改為小鍵盤的7鍵。玩war3的同學都知道,這兩個功能對於war3(尤其是DOTA)相當重要。

     首先簡單介紹一下,外掛程式類比鍵盤的原理。

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

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

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

      //鍵盤Hook結構函數        [StructLayout(LayoutKind.Sequential)]        public class KeyBoardHookStruct        {            public int vkCode;            public int scanCode;            public int flags;            public int time;            public int dwExtraInfo;        }        #region DllImport        //設定鉤子        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        //抽掉鉤子        public static extern bool UnhookWindowsHookEx(int idHook);        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        //調用下一個鉤子        public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);        //取得模組控制代碼         [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]        private static extern IntPtr GetModuleHandle(string lpModuleName);        //尋找目標進程視窗
        [DllImport("USER32.DLL")]        public static extern IntPtr FindWindow(string lpClassName,            string lpWindowName);         //設定進程視窗到最前 
        [DllImport("USER32.DLL")]        public static extern bool SetForegroundWindow(IntPtr hWnd);       //類比鍵盤事件 
        [DllImport("User32.dll")]        public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);

//釋放按鍵的常量   private const int KEYEVENTF_KEYUP =2;
       本例所使用的函數比較少,它們都在系統的USER32.dll裡,包括:設定和取消鉤子、調用下一個鉤子、匯入進程、類比鍵盤等等。我們依次匯入它們。
       這些函數的命名規範合理,幾乎只根據函數名就能知道其功能。
       如果讀者對於其中的某些函數不熟悉,請自行搜尋MSDN。

二、使用Windows API設定鉤子  

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

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

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

public void Hook_Start()    {        // 安裝鍵盤鉤子        if (hHook == 0)        {            KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);            hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);                             }    }
 
    先介紹一下設定鉤子的明星函數:SetWindowsHookEx 。它的參數說明如下。

SetWindowsHookEx(
idHook: Integer;   {鉤子類型}
lpfn: TFNHookProc; {函數指標}
hmod: HINST;       {包含鉤子函數的模組(EXE、DLL)控制代碼; 一般是 HInstance; 如果是當前線程這裡可以是 0}
  dwThreadId: DWORD  {關聯的線程; 可用 GetCurrentThreadId 擷取當前線程; 0 表示是系統級鉤子}
): HHOOK;            {返回鉤子的控制代碼; 0 表示失敗}

 

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

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

 

三、監控使用者操作

   設定好鉤子後,我們可以在被委託的函數中寫入監控使用者操作與類比鍵盤的代碼。

public static int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)        {       //監控使用者鍵盤輸入
         KeyBoardHookStruct input = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));            //截獲Home  鍵          
            if (input.vkCode == (int)Keys.Home)            {              //此處寫入其他動作邏輯                
            }                  // 繼續執行下一個鉤子程式            return CallNextHookEx(hHook, nCode, wParam, lParam);        }

 

四、根據使用者需要類比鍵盤操作

        顯血功能:玩war3的都知道,war3內建的顯血快速鍵有3個。Alt鍵是顯示所有單位生命,[ 鍵顯示友方單位生命,] 鍵顯示地方單位生命。外掛需要做的事情僅僅是類比一直按著某個鍵不鬆手而已。由於Alt鍵與其他很多鍵構成按鍵組合,故我們不能類比長按Alt,否則會影響正常遊戲。我們的解決方案應該是類比長按 [ 鍵和 ] 鍵。代碼如下:

              //獲得魔獸程式的控制代碼                IntPtr wcHandle = FindWindow(null, "Warcraft III");                //如果鉤子有效                if (wcHandle != IntPtr.Zero)                {                    //設定遊戲視窗到最前                    SetForegroundWindow(wcHandle);
                byte VK_NUM1 = 219;   //鍵盤上 [ 鍵的代碼。按[可顯示友方單位生命值。                  byte VK_NUM2 = 221;   // 鍵盤上] 鍵的代碼。按]可顯示敵方單位生命值。                  keybd_event(VK_NUM1, 0, 0, 0); //長按[                keybd_event(VK_NUM2, 0, 0, 0);  //長按]

               }

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

        //如果使用者按了Q鍵          if (input.vkCode == (int)Keys.Q)          {              //獲得魔獸程式的控制代碼              IntPtr wcHandle = FindWindow(null, "Warcraft III");              //如果鉤子有效              if (wcHandle != IntPtr.Zero)              {                  //設定遊戲視窗到最前                  SetForegroundWindow(wcHandle);                  byte VK_Q = (byte)Keys.NumPad7;                  keybd_event(VK_Q, 0, 0, 0);//按下小鍵盤7                  keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0); //鬆開小鍵盤7              }              return 1;          }

好了,到這裡就把類比鍵盤的外掛介紹完了。類比滑鼠與之非常類似,請使用者自行揣摩。本文僅做拋磚引玉,歡迎感興趣的朋友來流牛木馬的部落格進行討論。

轉載地址:
http://www.cnblogs.com/azure/archive/2009/07/03/1515967.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.