最近经朋友介绍开始玩 密传 网络游戏
升级升级,突然觉得太费键盘,于是自己用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#的面向对象特性,将各个功能模块化,提高了代码的可读性和可维护性。同时,AI的设计使游戏更具挑战性,而存档、悔棋等功能则增加了游戏的趣味性和用户...
C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏工具(源码)C#写的对对碰游戏...
在C#游戏辅助制作的世界里,通用修改器是开发者们常用的一种工具,它能帮助我们对游戏中的数据进行实时修改,以实现各种辅助功能。本教程主要针对C#初学者,旨在通过学习通用修改器的源码,让大家了解并掌握如何抓取...
这对于想要涉足游戏外挂或自动化工具开发的程序员来说,是一个很好的起点。同时,这个项目也强调了源码分享的精神,有助于编程社区的交流与进步。 总结来说,"XuXj按键精灵初试C#源代码"是一个实用的教程资源,它以...
通过阅读和理解这个源代码,你可以学习如何在C#应用程序中有效地监听和处理键盘事件,这对于开发需要键盘监控功能的软件,如屏幕录像工具、游戏外挂等,都是至关重要的。 总的来说,C#键盘HOOK技术涉及了对Windows ...
一、开启c#游戏之门 对于许多初学者来说,c#可能是一门既神秘又令人畏惧的语言。但其实,c#也可以非常有趣!这次我们为您带来了一系列c#小游戏资源,旨在让您在轻松愉快的氛围中,逐步掌握c#的精髓。 二、资源亮点...
在游戏开发领域,C#也得到了广泛的应用,尤其是在Unity引擎的推动下,它已经成为游戏开发的重要工具之一。 魔兽挂,即魔兽世界的自动化脚本或插件,它们通常用于帮助玩家完成重复性任务,如自动打怪、采集资源等。...
总结来说,C# 鼠标键盘钩子源代码提供了一种在Windows环境下实现全局键盘和鼠标事件监听的解决方案,这对于开发需要捕获用户输入的应用,如屏幕录制软件、游戏外挂检测等场景非常有用。通过学习和理解这段源代码,...
在本压缩包中,我们关注的是"C#网络编程高级篇之网页游戏辅助程序设计软件包",这是一份专门针对C#编程语言在网络编程领域的高级应用,特别是涉及到网页游戏辅助程序设计的实例代码。这份资源对于想要深入学习C#网络...
这种技术在多种应用场景中都有所使用,例如键盘记录器、游戏外挂或者自定义快捷键的实现。在C#编程语言中,我们可以利用Windows API来创建键盘钩子。下面我们将详细探讨如何使用C#实现模拟键盘和键盘钩子的相关知识...
学习这个源代码和实例,你可以了解如何在C#中利用Windows API进行系统级别的事件监听,这对于开发需要全局监控或控制输入的软件,如游戏外挂、自动化工具或者辅助性应用是非常有用的。同时,这也能加深对Windows编程...
在IT领域,尤其是在游戏开发、自动化测试或者图像处理软件中,"找图"是一个...这在自动化测试、游戏外挂、监控系统等领域有着广泛的应用。通过深入理解这些概念和技术,开发者能够创建出更快速、更精确的图像处理应用。
或者是游戏外挂,模拟玩家的操作;甚至在无障碍软件中,帮助残障人士通过其他设备控制鼠标。 综上所述,"C# 虚拟鼠标驱动源码"涵盖了C#编程、Windows API调用、设备驱动原理等多个方面的知识,对深入理解系统级编程...
此外,游戏中的“拼图外挂”功能——一键自动完成,无疑增加了趣味性和便利性。这一功能的实现可能基于深度优先搜索或广度优先搜索等图论算法,快速找到正确的拼图顺序。当然,这种自动化功能主要为休闲玩家提供,对...
简单的网页游戏辅助源码源码噢 适合新手 高手不要下载
总之,这个C#编写的《植物大战僵死》辅助工具实例为学习者提供了一个实践平台,通过它,不仅可以学习到C#编程的基础知识,还能深入了解游戏编程、外挂开发等高级主题。对于想要踏入游戏开发领域的初学者,这是一个...
在IT行业中,C#是一种广泛使用的编程语言,尤其在开发Windows应用程序和游戏方面表现出色。本篇将详细讲解如何使用C#来实现QQ登录和访问QQ空间的功能。首先,我们要明白QQ登录涉及到的是OAuth2.0授权协议,而访问QQ...
通过学习和理解这些源代码,开发者可以深入理解Windows操作系统底层的工作原理,提升系统级别的编程能力,以及实现各种高级功能,比如键盘鼠标监控、自动化工具或者游戏外挂。同时,Hook技术在软件开发、调试、测试...
"更加方便 又非WG"表示这个小型浏览器是合法且安全的,不是外挂(WG),而是通过合法途径实现对QQ游戏的便捷访问。这强调了软件的合法性以及对用户体验的优化。 至于【标签】中的"QQ游戏",说明该浏览器是专门为QQ...