最近经朋友介绍开始玩 密传 网络游戏
升级升级,突然觉得太费键盘,于是自己用C#写了一个程序,想代替我的操作,自己去打怪物,自己升级
用这个东西升了好多级了,现在把源码贴出来,和大家共享,欢迎大家批评指正,感激不尽。
程序大概分成两个部分,一个部分是类库,一个是应用程序
大概的思路就是找到游戏进程的主窗口句柄,然后发送游戏按键消息(模拟按键)。
附加我从12级开始外挂的配置文件
今天发现的模拟键盘的操作,虽然我不能用上,希望有人会到。
升级升级,突然觉得太费键盘,于是自己用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#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏...
用C#写的一个小程序,主要功能是在游戏中模拟键盘操作,里面用到了全局钩子、消息传递等方面的内容.代码较为简单,适合初学者参考. 使用方法:在盛世三国游戏中按F12,显示程序界面;在游戏中CTRL+Z,根据设置自动使用...
C#网络编程高级篇之网页游戏辅助程序设计的实例代码
简单的网页游戏辅助源码源码噢 适合新手 高手不要下载
拼图游戏支持自定义图片 有3*3 4*4 5*5 几个难度可以选择 有参考图片功能 独具拼图外挂功能 一键自动完成 吼吼 下了绝对不会后悔
普通游戏外挂:通过需改游戏执行代码/修改游戏内存数据/拦截游戏网络通讯等手段,破坏游戏进程,达到提升目的,这些手段是违法的。 GameAssist:使用AI技术进行屏幕检测,原理是用人工智能技术来玩游戏,不使用任何...
1.软件特点 a.人道:对对手人道,因为没有秒功能。 b.绿色安全:没有对游戏的内存进行访问或者修改,只是根据游戏呈现的图像进行捕获分析。速度只是比个人操作快那么一点点。...可以导出所有的源代码的。。
我们在一些场合经常需要模拟浏览器进行一些操作,比如模拟投票,或者模拟点击,或者Web游戏外挂。 二、解决方法: C#中封装好的WebClient可以在某些要求不算高的场景实现Http的Post和Get。具体请见如下代码: 代码...
本文根据时下最火小游戏微信跳一跳,编写的物理外挂,实现简单,具有DIY精神的都能迅速上手。废话不多说,先来点视频开开胃。 哈哈哈,是不是很爽很刺激,好了,不吊胃口了,还是整点干货吧。 准备1:手机一部,电脑...