知识大全 C#简单游戏外挂制作(以WarcraftⅢ为例)

Posted 函数

篇首语:幽映每白日,清辉照衣裳。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 C#简单游戏外挂制作(以WarcraftⅢ为例)相关的知识,希望对你有一定的参考价值。

C#简单游戏外挂制作(以WarcraftⅢ为例)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  网上有很多外挂制作的教程 大多是讲针对大型网络游戏的 主要包含一些抓包 反汇编 C++的知识综合 事实也如此 常见的外挂都是使用VC++写的 从来没有过C#或者其他 NET语言编写的外挂

  作为微软 NET技术的忠实粉丝 这难免是一种遗憾 不过不要紧 下面流牛木马就教大家两招 包教包会 免收学费 )

  其实作为游戏外挂来说 主要就是三个功能 模拟键盘操作 模拟鼠标操作 修改内存数据 修改内存数据比较难 但模拟鼠标键盘的操作却很简单 很多流行游戏的外挂 都可以只通过模拟鼠标键盘来实现 例如 劲舞团 QQ音速 连连看 各类网页游戏 以及各类大型网游中的自动打怪 自动吃药等等

  Warcraft Ⅲ 学名魔兽争霸之冰封王座 俗称魔兽 简称war 在最近六七年风靡全球 最近两年 war 在中国又掀起了玩DOTA的新高潮

  本文制作DOTA游戏中的显血 改键外挂为例 简单地介绍如何使用C#语言制作游戏外挂

  最终界面如下

  

  本示例包含两个功能 显血 将Q键改为小键盘的 键 玩war 的同学都知道 这两个功能对于war (尤其是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( user dll  CharSet = CharSet Auto  CallingConvention = CallingConvention StdCall)]    public static extern int SetWindowsHookEx(int idHook  HookProc lpfn  IntPtr hInstance  int threadId);    [DllImport( user dll  CharSet = CharSet Auto  CallingConvention = CallingConvention StdCall)]    //抽掉钩子    public static extern bool UnhookWindowsHookEx(int idHook);    [DllImport( user dll  CharSet = CharSet Auto  CallingConvention = CallingConvention StdCall)]    //调用下一个钩子    public static extern int CallNextHookEx(int idHook  int nCode  IntPtr wParam  IntPtr lParam);    //取得模块句柄     [DllImport( kernel dll  CharSet = CharSet Auto  CallingConvention = CallingConvention StdCall)]    private static extern IntPtr GetModuleHandle(string lpModuleName);

  //寻找目标进程窗口

  [DllImport( USER DLL )]    public static extern IntPtr FindWindow(string lpClassName       string lpWindowName);     //设置进程窗口到最前 

  [DllImport( USER DLL )]    public static extern bool SetForegroundWindow(IntPtr hWnd);    //模拟键盘事件 

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

  //释放按键的常量  private const int KEYEVENTF_KEYUP = ;

  本例所使用的函数比较少 它们都在系统的USER dll里 包括 设置和取消钩子 调用下一个钩子 导入进程 模拟键盘等等 我们依次导入它们

  这些函数的命名规范合理 几乎只根据函数名就能知道其功能

  如果读者对于其中的某些函数不熟悉 请自行搜索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(Process GetCurrentProcess() MainModule ModuleName)   );                 

  

  先介绍一下设置钩子的明星函数 SetWindowsHookEx  它的参数说明如下     SetWindowsHookEx(

  idHook Integer    钩子类型

  lpfn TFNHookProc 函数指针

  hmod HINST        包含钩子函数的模块(EXE DLL)句柄 一般是 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)Marshal PtrToStructure(lParam  typeof(KeyBoardHookStruct));

  //截获Home 键     

  if (input vkCode == (int)Keys Home)             //此处写入其他操作逻辑        

            // 继续执行下一个钩子程序      return CallNextHookEx(hHook  nCode  wParam  lParam);

      四 根据用户需要模拟键盘操作

  显血功能 玩war 的都知道 war 自带的显血快捷键有 个 Alt键是显示所有单位生命 [ 键显示友方单位生命 ] 键显示地方单位生命 外挂需要做的事情仅仅是模拟一直按著某个键不松手而已 由于Alt键与其他很多键构成组合键 故我们不能模拟长按Alt 否则会影响正常游戏 我们的解决方案应该是模拟长按 [ 键和 ] 键 代码如下

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

  //如果钩子有效        if (wcHandle != IntPtr Zero)                  //设置游戏窗口到最前          SetForegroundWindow(wcHandle);

  byte VK_NUM  =  ;  //键盘上 [ 键的代码 按[可显示友方单位生命值          byte VK_NUM  =  ;  // 键盘上] 键的代码 按]可显示敌方单位生命值          keybd_event(VK_NUM       ); //长按[        keybd_event(VK_NUM       ); //长按]

      改键 小键盘(Numpad)上的快捷键很不方便按 所以很多玩家喜欢把小键盘上的键改到左边的字母键盘 玩DOTA的同学都知道 没有任何英雄的技能使用 Q 这个快捷键(召唤师有一种球是 Q (不是技能)) 于是我们把小键盘上的 键改到Q上 也不会造成任何冲突 方法也很简单 如果监控到用户按 Q 键 则像游戏进程发送小键盘上的 键 代码如下

  //如果用户按了Q键     if (input vkCode == (int)Keys Q)            //获得魔兽程序的句柄       IntPtr wcHandle = FindWindow(null   Warcraft III );

cha138/Article/program/net/201311/12753

相关参考

知识大全 利用C#制作简单的留言板的方法

利用C#制作简单的留言板的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 用C#制作一个最简单的Web Service

用C#制作一个最简单的WebService  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 利用Visual C# 2005制作简单动画效果

利用VisualC#2005制作简单动画效果  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一般的W

知识大全 C#技巧:网页表单自动填写技术(以gmail为例)

C#技巧:网页表单自动填写技术(以gmail为例)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 怎么学习游戏制作,学习游戏制作的方法

怎么学习游戏制作,学习游戏制作的方法楼主你好,游戏设计细分为很多方面,可以简单跟你介绍下~游戏设计部门主要包括角色、场景、原画、动作、特效、程序这几个分工。【举个例子】对于一个游戏程序员来说,通常需要

知识大全 C# 制作以动画的方式显示图像[5]

C#制作以动画的方式显示图像[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!matrixMat

知识大全 C# 制作以动画的方式显示图像[2]

C#制作以动画的方式显示图像[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 C# 制作以动画的方式显示图像[3]

C#制作以动画的方式显示图像[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb

知识大全 C# 制作以动画的方式显示图像[4]

C#制作以动画的方式显示图像[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! mat

知识大全 C# 制作以动画的方式显示图像[8]

C#制作以动画的方式显示图像[8]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb