av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

一個簡單C#游戲程序制作

在向大家詳細介紹C#游戲程序制作之前,首先讓大家了解下作為游戲程序來說,主要就是三個功能:模擬鍵盤操作、模擬鼠標操作、修改內(nèi)存數(shù)據(jù),然后全面介紹C#游戲程序制作。

成都創(chuàng)新互聯(lián)主要從事成都網(wǎng)站設計、成都網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務德令哈,十載網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575

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

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

其實作為游戲程序來說,主要就是三個功能:模擬鍵盤操作、模擬鼠標操作、修改內(nèi)存數(shù)據(jù)。修改內(nèi)存數(shù)據(jù)比較難,但模擬鼠標鍵盤的操作卻很簡單。很多流行游戲的外掛,都可以只通過模擬鼠標鍵盤來實現(xiàn),例如:勁舞團、QQ音速、連連看、各類網(wǎng)頁游戲,以及各類大型網(wǎng)游中的自動打怪、自動吃藥等等。

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

本文制作DOTA游戲中的顯血、改鍵外掛為例,簡單地介紹如何制作C#游戲程序。

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

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

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

了解了這個過程之后,我們就可以開始整理思路了。完成C#游戲程序一共需要以下四個步驟:

一、聲明Windows API 中的函數(shù)和常量

 
 
 
  1.      //鍵盤Hook結(jié)構(gòu)函數(shù)
  2.         [StructLayout(LayoutKind.Sequential)]
  3.         public class KeyBoardHookStruct
  4.         {
  5.             public int vkCode;
  6.             public int scanCode;
  7.             public int flags;
  8.             public int time;
  9.             public int dwExtraInfo;
  10.         }
  11.         #region DllImport
  12.         //設置鉤子
  13.         [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  14.         public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
  15.         [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  16.         //抽掉鉤子
  17.         public static extern bool UnhookWindowsHookEx(int idHook);
  18.         [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  19.         //調(diào)用下一個鉤子
  20.         public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr lParam);
  21.         //取得模塊句柄 
  22.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  23.         private static extern IntPtr GetModuleHandle(string lpModuleName);
  24.         //尋找目標進程窗口
  25.         [DllImport("USER32.DLL")]
  26.         public static extern IntPtr FindWindow(string lpClassName,
  27.             string lpWindowName);
  28.          //設置進程窗口到最前 
  29. [DllImport("USER32.DLL")]
  30.         public static extern bool SetForegroundWindow(IntPtr hWnd);
  31.        //模擬鍵盤事件 
  32. [DllImport("User32.dll")]
  33.         public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);
  34. //釋放按鍵的常量
  35.    private const int KEYEVENTF_KEYUP =2;

本例所使用的函數(shù)比較少,它們都在系統(tǒng)的USER32.dll里,包括:設置和取消鉤子、調(diào)用下一個鉤子、導入進程、模擬鍵盤等等。我們依次導入它們。

這些函數(shù)的命名規(guī)范合理,幾乎只根據(jù)函數(shù)名就能知道其功能。

如果讀者對于其中的某些函數(shù)不熟悉,請自行搜索MSDN。

二、使用Windows API設置鉤子

有了以上windows API函數(shù)的聲明,下一步就是設置鉤子了。

寥寥兩行代碼,但包含了相當豐富的內(nèi)容。

 
 
 
  1. //委托
  2. public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
  3.  
  4. public void Hook_Start()
  5.     {
  6.         // 安裝鍵盤鉤子
  7.         if (hHook == 0)
  8.         {
  9.             KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);
  10.             hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
  11.                      
  12.         }
  13.     }

先介紹一下設置鉤子的明星函數(shù):SetWindowsHookEx 。它的參數(shù)說明如下。
◆SetWindowsHookEx(
◆idHook: Integer;   {鉤子類型}
◆lpfn: TFNHookProc; {函數(shù)指針}
◆hmod: HINST;       {包含鉤子函數(shù)的模塊(EXE、DLL)句柄; 一般是 HInstance; 如果是當前線程這里可以是 0}
◆dwThreadId: DWORD {關(guān)聯(lián)的線程; 可用 GetCurrentThreadId 獲取當前線程; 0 表示是系統(tǒng)級鉤子}
◆HHOOK;            {返回鉤子的句柄; 0 表示失敗}

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

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

三、監(jiān)控用戶操作

設置好鉤子后,我們可以在被委托的函數(shù)中寫入監(jiān)控用戶操作與模擬鍵盤的代碼。

 
 
 
  1. public static int KeyBoardHookProc(int nCode, IntPtr wParam, IntPtr lParam)
  2.         {
  3.        //監(jiān)控用戶鍵盤輸入
  4. KeyBoardHookStruct input = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
  5.             //截獲Home  鍵          
  6.             if (input.vkCode == (int)Keys.Home)
  7.             {
  8.               //此處寫入其他操作邏輯 
  9. }
  10.        
  11.            // 繼續(xù)執(zhí)行下一個鉤子程序
  12.             return CallNextHookEx(hHook, nCode, wParam, lParam);
  13.         }

四、根據(jù)用戶需要模擬鍵盤操作

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

 
 
 
  1. //獲得魔獸程序的句柄
  2.   IntPtr wcHandle = FindWindow(null, "Warcraft III");
  3.   //如果鉤子有效
  4.   if (wcHandle != IntPtr.Zero)
  5.   {
  6.       //設置游戲窗口到最前
  7.       SetForegroundWindow(wcHandle);
  8.   byte VK_NUM1 = 219;   //鍵盤上 [ 鍵的代碼。按[可顯示友方單位生命值。
  9.     byte VK_NUM2 = 221;   // 鍵盤上] 鍵的代碼。按]可顯示敵方單位生命值。
  10.     keybd_event(VK_NUM1, 0, 0, 0); //長按[
  11.   keybd_event(VK_NUM2, 0, 0, 0);  //長按]

改鍵:小鍵盤(Numpad)上的快捷鍵很不方便按,所以很多玩家喜歡把小鍵盤上的鍵改到左邊的字母鍵盤。玩war3的同學都知道,沒有任何英雄的技能使用"Q”這個快捷鍵。于是我們把小鍵盤上的7鍵改到Q上,也不會造成任何沖突。方法也很簡單:如果監(jiān)控到用戶按"Q”鍵,則像游戲進程發(fā)送小鍵盤上的"7"鍵。代碼如下:

 
 
 
  1. //如果用戶按了Q鍵
  2.    if (input.vkCode == (int)Keys.Q)
  3.    {
  4.        //獲得魔獸程序的句柄
  5.        IntPtr wcHandle = FindWindow(null, "Warcraft III");
  6.        //如果鉤子有效
  7.        if (wcHandle != IntPtr.Zero)
  8.        {
  9.            //設置游戲窗口到最前
  10.            SetForegroundWindow(wcHandle);
  11.            byte VK_Q = (byte)Keys.NumPad7;
  12.            keybd_event(VK_Q, 0, 0, 0);//按下小鍵盤7
  13.            keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0); //松開小鍵盤7
  14.        }
  15.        return 1;
  16.    }

好了,到這里就把模擬鍵盤的C#游戲程序介紹完了。模擬鼠標與之非常類似,請用戶自行揣摩。


分享文章:一個簡單C#游戲程序制作
網(wǎng)站網(wǎng)址:http://uogjgqi.cn/article/dhgjcsc.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流