`
comceo
  • 浏览: 14118 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

C#游戏外挂代码

阅读更多
最近经朋友介绍开始玩 密传 网络游戏
升级升级,突然觉得太费键盘,于是自己用C#写了一个程序,想代替我的操作,自己去打怪物,自己升级
用这个东西升了好多级了,现在把源码贴出来,和大家共享,欢迎大家批评指正,感激不尽。
程序大概分成两个部分,一个部分是类库,一个是应用程序
大概的思路就是找到游戏进程的主窗口句柄,然后发送游戏按键消息(模拟按键)。
XDF.GamePlugInCommon 类库项目 

//API.cs 文件,定义一些常用API函数及常量 

using System; 
using System.IO; 
using System.Threading; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 

namespace XDF.GamePlugInCommon 
{ 
/// <summary> 
/// API 的摘要说明。 
/// </summary> 
public sealed class API 
{ 
public static int WM_KEYDOWN = 0x0100; 
public static int WM_KEYUP = 0x0101; 
public static int WM_SYSKEYDOWN = 0x0104; 
public static int WM_SYSKEYUP = 0x0105; 

public static int WM_MOUSEMOVE = 0x0200; 
public static int WM_LBUTTONDOWN = 0x0201; 
public static int WM_LBUTTONUP = 0x0202; 
public static int WM_LBUTTONDBLCLK = 0x0203; 
public static int WM_RBUTTONDOWN = 0x0204; 
public static int WM_RBUTTONUP = 0x0205; 
public static int WM_RBUTTONDBLCLK = 0x0206; 
public static int WM_USER = 0x0400; 

public static int MK_LBUTTON = 0x0001; 
public static int MK_RBUTTON = 0x0002; 
public static int MK_SHIFT = 0x0004; 
public static int MK_CONTROL = 0x0008; 
public static int MK_MBUTTON = 0x0010; 

public static int MK_XBUTTON1 = 0x0020; 
public static int MK_XBUTTON2 = 0x0040; 

[DllImport("user32.dll")] 
public static extern int SendMessage(IntPtr hWnd,int Msg,int wParam,int lParam); 

//此处主要用来让窗口置于最前(SetWindowPos(this.Handle,-1,0,0,0,0,0x4000|0x0001|0x0002);) 
[System.Runtime.InteropServices.DllImport("user32.dll")] 
public static extern bool SetWindowPos(IntPtr hWnd, 
int hWndInsertAfter, 
int X, 
int Y, 
int cx, 
int cy, 
int uFlags 
); 

/// <summary> 
/// 窗口置前 
/// </summary> 
/// <param name="hWnd"></param> 
public static void SetWindowPos(IntPtr hWnd) 
{ 
SetWindowPos(hWnd,-1,0,0,0,0,0x4000|0x0001|0x0002); 
} 

/// <summary> 
/// 
/// </summary> 
/// <param name="processName"></param> 
/// <returns></returns> 
public static Process GetGameProcess(string processName) 
{ 
Process pro = null; 
Process[] pros = Process.GetProcessesByName(processName); 
if(pros.Length > 0) 
{ 
pro = pros[0]; 
} 
return pro; 
} 
} 
} 


项目(应用程序) 
XDF.TantraPlugIn 
//ControlItem.cs 
using System; 
using System.IO; 
using System.Xml.Serialization; 

namespace XDF.TantraPlugIn 
{ 
/// <summary> 
/// ControlItem 的摘要说明。 
/// </summary> 
[Serializable] 
public sealed class ControlItem 
{ 
private string m_Name = ""; 
public string Name 
{ 
get 
{ 
return this.m_Name; 
} 
set 
{ 
this.m_Name = value; 
} 
} 
private char m_KeyChar = 'a'; 
public char KeyChar 
{ 
get 
{ 
return this.m_KeyChar; 
} 
set 
{ 
this.m_KeyChar = value; 
} 
} 
private int m_DelayTime = 100; 
public int DelayTime 
{ 
get 
{ 
return this.m_DelayTime; 
} 
set 
{ 
this.m_DelayTime = value; 
} 
} 
public ControlItem() 
{ 

} 
} 
[Serializable] 
public sealed class ControlItemCollection : System.Collections.CollectionBase 
{ 
public ControlItem this[int index] 
{ 
get 
{ 
return (ControlItem)List[index]; 
} 
set 
{ 
List[index] = value; 
} 
} 
public ControlItemCollection() 
{ 
} 
public int Add(ControlItem item) 
{ 
return List.Add(item); 
} 
public void Remove(ControlItem item) 
{ 
List.Remove(item); 
} 
} 
}

//TantraConfig.cs 
using System; 
using System.IO; 
using System.Xml.Serialization; 

namespace XDF.TantraPlugIn 
{ 
/// <summary> 
/// TantraConfig 的摘要说明。 
/// </summary> 
[Serializable] 
public class TantraConfig 
{ 
private ControlItemCollection m_KillControls = new ControlItemCollection(); 
public ControlItemCollection KillControls 
{ 
get 
{ 
return this.m_KillControls; 
} 
set 
{ 
this.m_KillControls = value; 
} 
} 
private ControlItemCollection m_BloodControls = new ControlItemCollection(); 
public ControlItemCollection BloodControls 
{ 
get 
{ 
return this.m_BloodControls; 
} 
set 
{ 
this.m_BloodControls = value; 
} 
} 

private int m_BloodRate = 25; 

public int BloodRate 
{ 
get 
{ 
return this.m_BloodRate; 
} 
set 
{ 
this.m_BloodRate = value; 
} 
} 

private string m_ProcessName = "HTLauncher"; 

public string ProcessName 
{ 
get 
{ 
return this.m_ProcessName; 
} 
set 
{ 
this.m_ProcessName = value; 
} 
} 

public TantraConfig() 
{ 

} 

public bool Save(string file) 
{ 
bool result = false; 
try 
{ 
FileStream fs = new FileStream(file,FileMode.Create,FileAccess.Write); 
XmlSerializer xsl = new XmlSerializer(this.GetType()); 
xsl.Serialize(fs,this); 
fs.Close(); 
result = true; 
} 
catch 
{ 
result = false; 
} 
return result; 
} 
public static TantraConfig LoadFromFile(string file) 
{ 
TantraConfig config = null; 
try 
{ 
FileStream fs = new FileStream(file,FileMode.Open,FileAccess.Read); 
XmlSerializer xsl = new XmlSerializer(typeof(TantraConfig)); 
config = (TantraConfig)xsl.Deserialize(fs); 
fs.Close(); 
} 
catch 
{ 

} 
return config; 
} 
} 
}   


//Frmmain.cs 
using System; 
using System.Drawing; 
using System.Collections; 
using System.ComponentModel; 
using System.Windows.Forms; 
using System.Data; 
using System.Threading; 

using XDF.GamePlugInCommon; 

namespace XDF.TantraPlugIn 
{ 
/// <summary> 
/// Form1 的摘要说明。 
/// </summary> 
public class Frmmain : System.Windows.Forms.Form 
{ 
private System.Windows.Forms.Button btnSetup; 
private System.Windows.Forms.Timer timerMain; 
private System.Windows.Forms.Button btnStart; 
private System.ComponentModel.IContainer components; 

public Frmmain() 
{ 
// 
// Windows 窗体设计器支持所必需的 
// 
InitializeComponent(); 


this.Closing +=new CancelEventHandler(Frmmain_Closing); 
} 

/// <summary> 
/// 清理所有正在使用的资源。 
/// </summary> 
protected override void Dispose( bool disposing ) 
{ 
if( disposing ) 
{ 
if (components != null) 
{ 
components.Dispose(); 
} 
} 
base.Dispose( disposing ); 
} 

#region Windows 窗体设计器生成的代码 
/// <summary> 
/// 设计器支持所需的方法 - 不要使用代码编辑器修改 
/// 此方法的内容。 
/// </summary> 
private void InitializeComponent() 
{ 
this.components = new System.ComponentModel.Container(); 
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Frmmain)); 
this.btnStart = new System.Windows.Forms.Button(); 
this.btnSetup = new System.Windows.Forms.Button(); 
this.timerMain = new System.Windows.Forms.Timer(this.components); 
this.SuspendLayout(); 
// 
// btnStart 
// 
this.btnStart.Location = new System.Drawing.Point(8, 16); 
this.btnStart.Name = "btnStart"; 
this.btnStart.Size = new System.Drawing.Size(65, 22); 
this.btnStart.TabIndex = 0; 
this.btnStart.Text = "开始(&S)"; 
this.btnStart.Click += new System.EventHandler(this.btnStart_Click); 
// 
// btnSetup 
// 
this.btnSetup.Location = new System.Drawing.Point(152, 16); 
this.btnSetup.Name = "btnSetup"; 
this.btnSetup.Size = new System.Drawing.Size(65, 22); 
this.btnSetup.TabIndex = 1; 
this.btnSetup.Text = "设置(&C)"; 
this.btnSetup.Click += new System.EventHandler(this.btnSetup_Click); 
// 
// Frmmain 
// 
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); 
this.ClientSize = new System.Drawing.Size(226, 55); 
this.Controls.Add(this.btnSetup); 
this.Controls.Add(this.btnStart); 
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 
this.MaximizeBox = false; 
this.MinimizeBox = false; 
this.Name = "Frmmain"; 
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 
this.Text = "Tantra PlugIn beta1"; 
this.ResumeLayout(false); 

} 
#endregion 

/// <summary> 
/// 应用程序的主入口点。 
/// </summary> 
[STAThread] 
static void Main() 
{ 
Application.Run(new Frmmain()); 
} 

private TantraConfig m_TantraConfig = null; 
private Thread m_Thread = null; 
private bool m_Stop = true; 
private IntPtr m_GameMainWindowHandle = IntPtr.Zero; 

private void btnSetup_Click(object sender, System.EventArgs e) 
{ 
TantraConfig config = new TantraConfig(); 

ControlItemCollection items = config.KillControls; 

ControlItem item_e = new ControlItem(); 
item_e.DelayTime = 50; 
item_e.KeyChar = 'E'; 
item_e.Name = "选择最近的攻击目标"; 
items.Add(item_e); 

ControlItem item_r = new ControlItem(); 
item_r.DelayTime = 6000; 
item_r.KeyChar = 'R'; 
item_r.Name = "攻击选定的目标"; 
items.Add(item_r); 

ControlItem item_f = new ControlItem(); 
item_f.DelayTime = 500; 
item_f.KeyChar = 'F'; 
item_f.Name = "捡起打完怪物掉下的物品"; 
items.Add(item_f); 

ControlItem item_f2 = new ControlItem(); 
item_f2.DelayTime = 500; 
item_f2.KeyChar = 'F'; 
item_f2.Name = "捡起打完怪物掉下的金币"; 
items.Add(item_f2); 

ControlItem item_blood = new ControlItem(); 
item_blood.DelayTime = 1000; 
item_blood.KeyChar = '1'; 
item_blood.Name = "自动增加体能秘技"; 
config.BloodControls.Add(item_blood); 

config.Save("c:\\tantra.xml"); 

} 

private void btnStart_Click(object sender, System.EventArgs e) 
{ 
if(this.m_Stop) 
{ 
this.StartControl(); 
} 
else 
{ 
this.StopControl(); 
} 
this.btnStart.Text = (this.m_Stop)?"开始(&S)":"停止(&S)"; 
} 

private void StartControl() 
{ 
string file = Environment.CurrentDirectory + "\\tantra.xml"; 
this.m_TantraConfig = TantraConfig.LoadFromFile(file); 
if(this.m_TantraConfig == null) 
{ 
MessageBox.Show("配置文件未找到,无法启动!"); 
return; 
} 

//HTLauncher 
//string proname = "TantraPlugIn"; 
System.Diagnostics.Process pro = API.GetGameProcess(this.m_TantraConfig.ProcessName); 
if(pro == null) 
{ 
MessageBox.Show("游戏进程 "+this.m_TantraConfig.ProcessName+" 未找到,无法启动!"); 
return; 
} 
this.m_GameMainWindowHandle = pro.MainWindowHandle; 
this.Text = "Game name:" + pro.ProcessName; 


this.m_Stop = false; 
this.m_Thread = new Thread( 
new ThreadStart(TantraControl)); 

this.m_Thread.Start(); 
} 

private void StopControl() 
{ 
if(this.m_Thread != null) 
{ 
this.m_Stop = true; 
this.m_Thread.Abort(); 
} 
} 

private void TantraControl() 
{ 
int count = 0; 
while(!this.m_Stop) 
{ 
for(int i=0;i<this.m_TantraConfig.KillControls.Count;i++) 
{ 
API.SendMessage(this.m_GameMainWindowHandle,API.WM_KEYDOWN, 
Convert.ToInt32(this.m_TantraConfig.KillControls[i].KeyChar),0); 
Thread.Sleep(this.m_TantraConfig.KillControls[i].DelayTime); 
} 
count ++; 
if(count >= this.m_TantraConfig.BloodRate) 
{ 
count = 0; 
for(int i=0;i<this.m_TantraConfig.BloodControls.Count;i++) 
{ 
API.SendMessage(this.m_GameMainWindowHandle,API.WM_KEYDOWN, 
Convert.ToInt32(this.m_TantraConfig.BloodControls[i].KeyChar),0); 
Thread.Sleep(this.m_TantraConfig.BloodControls[i].DelayTime); 
} 
} 
} 
} 

protected override void WndProc(ref Message m) 
{ 
base.WndProc (ref m); 
if(m.Msg == API.WM_KEYDOWN) 
{ 
this.Text = m.WParam.ToInt32().ToString(); 
if(this.Text == "1") 
{ 
MessageBox.Show("blood"); 
} 
} 
} 

private void Frmmain_Closing(object sender, CancelEventArgs e) 
{ 
try 
{ 
this.StopControl(); 
} 
catch 
{ 
} 
} 

} 
}   

附加我从12级开始外挂的配置文件
<?xml version="1.0"?> 
<TantraConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<KillControls> 
<ControlItem> 
<Name>选择最近的攻击目标</Name> 
<KeyChar>69</KeyChar> 
<DelayTime>50</DelayTime> 
</ControlItem> 
<ControlItem> 
<Name>攻击选定的目标</Name> 
<KeyChar>82</KeyChar> 
<DelayTime>5000</DelayTime> 
</ControlItem> 
<ControlItem> 
<Name>捡起打完怪物掉下的物品</Name> 
<KeyChar>70</KeyChar> 
<DelayTime>500</DelayTime> 
</ControlItem> 
<ControlItem> 
<Name>捡起打完怪物掉下的金币</Name> 
<KeyChar>70</KeyChar> 
<DelayTime>500</DelayTime> 
</ControlItem> 
</KillControls> 
<BloodControls> 
<ControlItem> 
<Name>自动增加体能秘技</Name> 
<KeyChar>49</KeyChar> 
<DelayTime>1000</DelayTime> 
</ControlItem> 
</BloodControls> 
<BloodRate>20</BloodRate> 
<ProcessName>HTLauncher</ProcessName> 
</TantraConfig>   

今天发现的模拟键盘的操作,虽然我不能用上,希望有人会到。
分享到:
评论

相关推荐

    智能象棋游戏源码 c# WINFROM

    通过以上分析,我们可以看出,这个智能象棋游戏源码充分利用了C#的面向对象特性,将各个功能模块化,提高了代码的可读性和可维护性。同时,AI的设计使游戏更具挑战性,而存档、悔棋等功能则增加了游戏的趣味性和用户...

    C#写的对对碰游戏工具(源码)

    C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏...

    C#游戏辅助制作教程-通用修改器源码-抓取内存基址

    在C#游戏辅助制作的世界里,通用修改器是开发者们常用的一种工具,它能帮助我们对游戏中的数据进行实时修改,以实现各种辅助功能。本教程主要针对C#初学者,旨在通过学习通用修改器的源码,让大家了解并掌握如何抓取...

    XuXj按键精灵初试C#源代码

    这对于想要涉足游戏外挂或自动化工具开发的程序员来说,是一个很好的起点。同时,这个项目也强调了源码分享的精神,有助于编程社区的交流与进步。 总结来说,"XuXj按键精灵初试C#源代码"是一个实用的教程资源,它以...

    C# 键盘HOOK源代码

    通过阅读和理解这个源代码,你可以学习如何在C#应用程序中有效地监听和处理键盘事件,这对于开发需要键盘监控功能的软件,如屏幕录像工具、游戏外挂等,都是至关重要的。 总的来说,C#键盘HOOK技术涉及了对Windows ...

    C#版 微信 跳一跳 小游戏辅助程序。.zip

    一、开启c#游戏之门 对于许多初学者来说,c#可能是一门既神秘又令人畏惧的语言。但其实,c#也可以非常有趣!这次我们为您带来了一系列c#小游戏资源,旨在让您在轻松愉快的氛围中,逐步掌握c#的精髓。 二、资源亮点...

    C# 编写的魔兽挂,开源

    在游戏开发领域,C#也得到了广泛的应用,尤其是在Unity引擎的推动下,它已经成为游戏开发的重要工具之一。 魔兽挂,即魔兽世界的自动化脚本或插件,它们通常用于帮助玩家完成重复性任务,如自动打怪、采集资源等。...

    C# 鼠标键盘钩子源代码

    总结来说,C# 鼠标键盘钩子源代码提供了一种在Windows环境下实现全局键盘和鼠标事件监听的解决方案,这对于开发需要捕获用户输入的应用,如屏幕录制软件、游戏外挂检测等场景非常有用。通过学习和理解这段源代码,...

    C#网络编程高级篇之网页游戏辅助程序设计软件包

    在本压缩包中,我们关注的是"C#网络编程高级篇之网页游戏辅助程序设计软件包",这是一份专门针对C#编程语言在网络编程领域的高级应用,特别是涉及到网页游戏辅助程序设计的实例代码。这份资源对于想要深入学习C#网络...

    模拟键盘C#键盘勾子源代码

    这种技术在多种应用场景中都有所使用,例如键盘记录器、游戏外挂或者自定义快捷键的实现。在C#编程语言中,我们可以利用Windows API来创建键盘钩子。下面我们将详细探讨如何使用C#实现模拟键盘和键盘钩子的相关知识...

    c# 全局 键盘鼠标钩子 源代码+实例

    学习这个源代码和实例,你可以了解如何在C#中利用Windows API进行系统级别的事件监听,这对于开发需要全局监控或控制输入的软件,如游戏外挂、自动化工具或者辅助性应用是非常有用的。同时,这也能加深对Windows编程...

    C#高速找图

    在IT领域,尤其是在游戏开发、自动化测试或者图像处理软件中,"找图"是一个...这在自动化测试、游戏外挂、监控系统等领域有着广泛的应用。通过深入理解这些概念和技术,开发者能够创建出更快速、更精确的图像处理应用。

    C# 虚拟鼠标驱动源码

    或者是游戏外挂,模拟玩家的操作;甚至在无障碍软件中,帮助残障人士通过其他设备控制鼠标。 综上所述,"C# 虚拟鼠标驱动源码"涵盖了C#编程、Windows API调用、设备驱动原理等多个方面的知识,对深入理解系统级编程...

    c#2010写的拼图游戏

    此外,游戏中的“拼图外挂”功能——一键自动完成,无疑增加了趣味性和便利性。这一功能的实现可能基于深度优先搜索或广度优先搜索等图论算法,快速找到正确的拼图顺序。当然,这种自动化功能主要为休闲玩家提供,对...

    简单的网页游戏辅助源码

    简单的网页游戏辅助源码源码噢 适合新手 高手不要下载

    C#编写的《植物大战僵死》辅助工具实例

    总之,这个C#编写的《植物大战僵死》辅助工具实例为学习者提供了一个实践平台,通过它,不仅可以学习到C#编程的基础知识,还能深入了解游戏编程、外挂开发等高级主题。对于想要踏入游戏开发领域的初学者,这是一个...

    c#代码QQ登录qq空间源码

    在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows应用程序和游戏方面表现出色。本篇将详细讲解如何使用C#来实现QQ登录和访问QQ空间的功能。首先,我们要明白QQ登录涉及到的是OAuth2.0授权协议,而访问QQ...

    C# 鼠标 HOOK API 源代码

    通过学习和理解这些源代码,开发者可以深入理解Windows操作系统底层的工作原理,提升系统级别的编程能力,以及实现各种高级功能,比如键盘鼠标监控、自动化工具或者游戏外挂。同时,Hook技术在软件开发、调试、测试...

    C#QQ网页游戏网站浏览器源码(浏览器各种操作源码)

    "更加方便 又非WG"表示这个小型浏览器是合法且安全的,不是外挂(WG),而是通过合法途径实现对QQ游戏的便捷访问。这强调了软件的合法性以及对用户体验的优化。 至于【标签】中的"QQ游戏",说明该浏览器是专门为QQ...

Global site tag (gtag.js) - Google Analytics