`
comceo
  • 浏览: 13748 次
  • 性别: 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>   

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

相关推荐

Global site tag (gtag.js) - Google Analytics