自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

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

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

其實作為游戲程序來說,主要就是三個功能:模擬鍵盤操作、模擬鼠標操作、修改內(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.         //尋找目標進程窗口  
  26.         [DllImport("USER32.DLL")]  
  27.         public static extern IntPtr FindWindow(string lpClassName,  
  28.             string lpWindowName);  
  29.          //設置進程窗口到最前   
  30. [DllImport("USER32.DLL")]  
  31.         public static extern bool SetForegroundWindow(IntPtr hWnd);  
  32.        //模擬鍵盤事件   
  33. [DllImport("User32.dll")]  
  34.         public static extern void keybd_event(Byte bVk, Byte bScan, Int32 dwFlags, Int32 dwExtraInfo);  
  35.  
  36. //釋放按鍵的常量  
  37.    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.  
  5. public void Hook_Start()  
  6.     {  
  7.         // 安裝鍵盤鉤子  
  8.         if (hHook == 0)  
  9.         {  
  10.             KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);  
  11.  
  12.             hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);  
  13.                        
  14.         }  
  15.     } 

先介紹一下設置鉤子的明星函數(shù):SetWindowsHookEx 。它的參數(shù)說明如下。
◆SetWindowsHookEx(
◆idHook: Integer;   {鉤子類型}
◆lpfn: TFNHookProc; {函數(shù)指針}
◆hmod: HINST;       {包含鉤子函數(shù)的模塊(EXE、DLL)句柄; 一般是 HInstance; 如果是當前線程這里可以是 0}
◆dwThreadId: DWORD {關聯(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.  
  6.             //截獲Home  鍵            
  7.             if (input.vkCode == (int)Keys.Home)  
  8.             {  
  9.               //此處寫入其他操作邏輯   
  10. }  
  11.          
  12.            // 繼續(xù)執(zhí)行下一個鉤子程序  
  13.             return CallNextHookEx(hHook, nCode, wParam, lParam);  
  14.  
  15.         } 

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

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

  1. //獲得魔獸程序的句柄  
  2.   IntPtr wcHandle = FindWindow(null"Warcraft III");  
  3.  
  4.   //如果鉤子有效  
  5.   if (wcHandle != IntPtr.Zero)  
  6.   {  
  7.       //設置游戲窗口到最前  
  8.       SetForegroundWindow(wcHandle);  
  9.   byte VK_NUM1 = 219;   //鍵盤上 [ 鍵的代碼。按[可顯示友方單位生命值。  
  10.     byte VK_NUM2 = 221;   // 鍵盤上] 鍵的代碼。按]可顯示敵方單位生命值。  
  11.     keybd_event(VK_NUM1, 0, 0, 0); //長按[  
  12.   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.        //如果鉤子有效  
  8.        if (wcHandle != IntPtr.Zero)  
  9.        {  
  10.            //設置游戲窗口到最前  
  11.            SetForegroundWindow(wcHandle);  
  12.            byte VK_Q = (byte)Keys.NumPad7;  
  13.            keybd_event(VK_Q, 0, 0, 0);//按下小鍵盤7  
  14.            keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0); //松開小鍵盤7  
  15.        }  
  16.        return 1;  
  17.    } 

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

【編輯推薦】

  1. 看看C# Hook 如何實現(xiàn)
  2. 學習C#虛函數(shù)實例演示
  3. 一個C#數(shù)據(jù)訪問XML的例子
  4. C#特性之通俗演義
  5. 探尋C# 3.5新特性
責任編輯:book05 來源: hi.baidu
相關推薦

2009-08-25 01:46:00

C# WINDOWS服

2021-01-14 08:55:20

C語言編程

2009-08-28 09:55:15

C#時間間隔

2009-07-31 17:14:19

C#語言Web程序

2009-09-11 09:10:30

C#編寫游戲

2009-09-01 16:14:06

C#窗口抖動

2021-01-05 12:38:53

C++編程語言軟件開發(fā)

2009-07-30 17:10:51

C#時間間隔

2009-08-14 00:55:21

C#程序編譯

2009-08-19 14:15:42

C# 復合控件

2011-06-16 15:36:56

Qt Quick Symbian

2009-10-14 09:58:43

VB.NET程序

2021-01-01 19:30:21

Python編程語言

2021-02-05 16:03:48

JavaScript游戲?qū)W習前端

2023-12-07 07:26:04

2022-11-02 08:51:01

2009-07-30 18:18:27

C#時間計算

2009-08-18 17:19:33

C#事件模型

2009-07-22 17:15:04

C#實現(xiàn)

2019-09-23 09:11:02

Python文本編輯器操作系統(tǒng)
點贊
收藏

51CTO技術棧公眾號