最近经朋友介绍开始玩   密传   网络游戏  
  升级升级,突然觉得太费键盘,于是自己用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>  

            今天发现的模拟键盘的操作,虽然我不能用上,希望有人会到。
posted on 2007-07-11 09:17  季沫  阅读(3069)  评论(2编辑  收藏  举报