首页 > 代码库 > c#QQ连连看辅助

c#QQ连连看辅助

近来无事,写个连连看辅助,下面先说下思路吧(口才不行,见谅哈)

游戏辅助有三种方法,一种是读内存,这个不知道怎么分析,还有一种是获取封包,这个分析起来复杂,最后一种是图片识别再分析,这里采用最后一种 图片识别来做。

设计UI如下

连连看开始》启动辅助》得到游戏窗口信息(位置,大小)》将游戏窗口置顶(其实就是激活状态),并恢复默认状态》截取整个屏幕保存起来》得到游戏区域的坐标信息》分割游戏区域将每一块的大小,位置,并在其上面取9个点的颜色值,存入到List<List<T>>中(同时判断是不是背景色,背景判断是求9个点的颜色平均值,如果每个点和平均值相差5以内就认定是背景)》循环List<List<T>>开始识别

 

下面说下识别时候的思路

先给个图片

我们都知道连连看最多只可以拐2次

假设红色方块是开始位置,先向左一个方格,得到方格,如果是背景或者是已经消除了的,则检测上方,如果是没有消除的,则判定是不是一样的,

然后向下取一个方格,这时候已经拐了1次了,然后判断这个方格的左侧,然后右侧,然后下侧

按照图上的解释下

得到1是背景则向上,不是背景,判断和目标方块不一样,则向下得到3,是背景,则查看3的左侧,是背景,再左侧,是背景,再....查看到尽头是背景(这个地方为什么不看上下了呢?因为这个时候已经拐了2次了),然后看右侧,得到5,是背景,再右侧...到尽头是背景,然后还是继续向下得到6,是背景,然后看6的左右,依次类推,如果1的下方都没有找到 ,那么继续向左找,得到7,看7的上下,依次类推

 

 

本来我是打算使用大漠插件做的 ,但是遇到2个问题:1、采集图片信息太慢,每个方块9个点,采集19*11个方块竟然用了40多S(也可能是我没有找到合适的方法),2、识别后点击的时候快速移动并点击多次会报错

所以我准备自己调用user32.dll的方法来实现

 

另外,你需要开启连连看游戏,截屏一个图片,然后创建一个解决方案将这个图片放到窗体上,模拟一个游戏窗口,你总不能编写的时候 一会启动一下游戏吧,测试可以用你这个窗口来,等写好后最后测试再用QQ游戏测试下效果

 

新建一个winform方案,再这个方案想再添加一个专案,就是上面提到的那个测试窗体,就是拉一个picbox放图片,窗体样式设为none效果如下图,

这里你还要得到一个数据,就是窗口左上角到上图红点位置的xy坐标值

我使用根据进程获取句柄,后来发现连连看进程名字会改变,所以需要在config.txt里面配置下  或者修改根据窗口名字获得句柄

然后下面介绍下各个类的作用

Form1  主窗体

  1 using System;  2 using System.Collections.Generic;  3 using System.ComponentModel;  4 using System.Data;  5 using System.Drawing;  6 using System.Text;  7 using System.Windows.Forms;  8 using System.Threading;  9 using System.Diagnostics; 10 using System.IO; 11  12 namespace LianLianHelp 13 { 14     public partial class Form1 : Form 15     { 16         public static int SleepTime = 10; 17         private bool isstop = true; 18         private bool isstart = false; 19         string gamename = "KYODAI~1"; 20         public Form1() 21         { 22             InitializeComponent(); 23             // dm.SetPath(Application.StartupPath + "\\aa"); 24         } 25         Point gamePoint1 = new Point(); 26         private void button1_Click(object sender, EventArgs e) 27         { 28  29             this.button1.Enabled = false; 30             // Start(); 31             Thread th = new Thread(Start); 32             th.IsBackground = true; 33             th.Start(); 34         } 35  36         private void Start() 37         { 38             isstart = true; 39             isstop = false; 40             LianLianHelp.LianLelp.ClearList(); 41             GetGamePanel(); 42             GetNodes(); 43             try 44             { 45                 StarCheckNode(); 46             } 47             catch 48             { } 49             isstart = false; 50             isstop = true; 51             this.button1.BeginInvoke(new MethodInvoker(delegate() 52             { 53                 button1.Enabled = true; 54             })); 55         } 56  57         /// <summary> 58         /// 得到游戏信息 59         /// </summary> 60         private void GetGamePanel() 61         { 62             //YodaoDict    LianLianDemo 63             // Process[] ps = Process.GetProcessesByName("KYODAI~1"); 64             Process[] ps = Process.GetProcessesByName(gamename); 65             IntPtr lianlian_hwnd = ps[0].MainWindowHandle; 66             //  int lianlian_hwnd = dm.FindWindow("", "QQ游戏 - 连连看角色版"); 67  68             Point mousepoint = LianLianHelp.GetMousePoint(); 69             LianLianHelp.ShowWindow(lianlian_hwnd, 1); 70             LianLianHelp.SetForegroundWindow(lianlian_hwnd); 71             // dm.GetCursorPos(ref x, ref y); 72             //dm.SetWindowState(lianlian_hwnd, 1); 73             // dm.MoveTo(0, 0); 74             LianLianHelp.MoveMouse(0, 0); 75             //LianLianHelp.SetWindowSize(); 76             LianLianHelp.LianLelp.PrintScreen(Application.StartupPath + "\\screen.jpg"); 77             // dm.CaptureJpg(0, 0, dm.GetScreenWidth(), dm.GetScreenHeight(), "screen.jpg", 100); 78             LianLianHelp.MoveMouse(mousepoint.X, mousepoint.Y); 79             // dm.MoveTo((int)x, (int)y); 80             //得到窗口大小 81             int x1 = 0, x2 = 0, y1 = 0, y2 = 0; 82             LianLianHelp.GetWindowRects(lianlian_hwnd, ref x1, ref y1, ref x2, ref y2); 83             gamePoint1 = new Point((int)x1 + HelpSource.game_offset.X, (int)y1 + HelpSource.game_offset.Y); 84         } 85  86         /// <summary> 87         /// 得到游戏图片方块 88         /// </summary> 89         private void GetNodes() 90         { 91             int x = gamePoint1.X; 92             int y = gamePoint1.Y; 93  94             Bitmap bitmap = new Bitmap(Application.StartupPath + "\\screen.jpg"); 95             for (int j = 0; j < 19; j++) 96             { 97                 int _x = x + HelpSource.pieceSize.Width * j; 98  99                 List<LianLianClass> lclist = new List<LianLianClass>();100                 for (int i = 0; i < 11; i++)101                 {102                     int _y = y + HelpSource.pieceSize.Height * i;103                     LianLianClass lc = new LianLianClass();104 105                     int xindex = _x + 10;106                     int[] _corlrs = new int[9];107                     int cindex = 0;108                     for (int m = 0; m < 3; m++)109                     {110                         int yindex = _y + 10;111                         for (int n = 0; n < 3; n++)112                         {113                             Color color = bitmap.GetPixel(xindex, yindex);114 115                             int r = Convert.ToInt32(color.R);116                             int g = Convert.ToInt32(color.G);117                             int b = Convert.ToInt32(color.B);118                             //string colorstr = dm.GetColor(xindex, yindex);119                             //int _colorcount = Getcolor(colorstr);120                             _corlrs[cindex] = r + g + b;121                             yindex += 5;122                             cindex++;123                         }124                         xindex += 5;125                     }126                     int colorcount = 0;127                     lc.IsBackgrpund = CheckValue(_corlrs, ref colorcount);128                     lc.ThisPoint = new Point(_x + 15, _y + 15);129                     lc.ListPoint = new Point(j, i);130                     lc.ColorNumCount = _corlrs;131                     lclist.Add(lc);132                 }133                 LianLianHelp.LianLelp.LianList.Add(lclist);134             }135             bitmap.Dispose();136         }137 138         private void StarCheckNode()139         {140             List<List<LianLianClass>> lianList = LianLianHelp.LianLelp.LianList;141             while (true)142             {143                 for (int x = 0; x < 19; x++)144                 {145                     for (int y = 0; y < 11; y++)146                     {147                         if (lianList[x][y].IsBackgrpund || lianList[x][y].Ismove)148                             continue;149                         thisllc = lianList[x][y];150 151                         //  thisllc.ListPoint = new Point(x, y);152                         if (!CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.LEFT))153                             if (!CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.UP))154                                 if (!CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.RIGHT))155                                     CheckNode(thisllc, 0, NODETYPE.SOURCENODE, TODIRECTION.DOWN);156                     }157                 }158                 if (LianLianHelp.LianLelp.CheckISOK())159                 {160                     break;161                 }162             }163         }164         LianLianClass thisllc = null;165         LianLianClass checkllc = null;166         /// <summary>167         /// 168         /// </summary>169         /// <param name="lc">当前位置方块</param>170         /// <param name="checkindex">第几个转弯,</param>171         /// <param name="nodeType">lc类型</param>172         /// <param name="toDirection">方向</param>173         private bool CheckNode(LianLianClass lc, int checkindex, NODETYPE nodeType, TODIRECTION toDirection)174         {175             if (isstop)176             {177                 throw new Exception();178             }179             if (checkindex > 2)180                 return false;181             if (toDirection == TODIRECTION.LEFT)182             {183                 #region left184                 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);185                 if (_lc == null)186                     return false;187                 if (_lc.ListPoint == thisllc.ListPoint)188                     return false;189                 if (_lc.IsBackgrpund || _lc.Ismove)190                 {191                     int _c = checkindex + 1;192                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.UP))193                     {194                         return true;195                     }196                     _c = checkindex + 1;197                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.DOWN))198                     {199                         return true;200                     }201                     else202                     {203                         _c = checkindex;204                         return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.LEFT);205                     }206                 }207                 else208                 {209                     if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))210                     {211                         ClickNode(_lc, thisllc);212                         return true;213                     }214                     else215                         return false;216                 }217                 #endregion218             }219             else if (toDirection == TODIRECTION.RIGHT)220             {221                 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);222                 if (_lc == null)223                     return false;224                 if (_lc.ListPoint == thisllc.ListPoint)225                     return false;226                 if (_lc.IsBackgrpund || _lc.Ismove)227                 {228                     int _c = checkindex + 1;229                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.UP))230                     {231                         return true;232                     }233                     _c = checkindex + 1;234                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.DOWN))235                     {236                         return true;237                     }238                     else239                     {240                         _c = checkindex;241                         return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.RIGHT);242                     }243                 }244                 else245                 {246                     if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))247                     {248                         ClickNode(_lc, thisllc);249                         return true;250                     }251                     else252                         return false;253                 }254             }255             else if (toDirection == TODIRECTION.UP)256             {257                 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);258                 if (_lc == null)259                     return false;260                 if (_lc.ListPoint == thisllc.ListPoint)261                     return false;262                 if (_lc.IsBackgrpund || _lc.Ismove)263                 {264                     int _c = checkindex + 1;265                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.LEFT))266                     {267                         return true;268                     }269                     _c = checkindex + 1;270                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.RIGHT))271                     {272                         return true;273                     }274                     else275                     {276                         _c = checkindex;277                         return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.UP);278                     }279                 }280                 else281                 {282                     if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))283                     {284                         ClickNode(_lc, thisllc);285                         return true;286                     }287                     else288                         return false;289                 }290             }291             else292             {293                 LianLianClass _lc = LianLianHelp.LianLelp.GetNextLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection);294                 if (_lc == null)295                     return false;296                 if (_lc.ListPoint == thisllc.ListPoint)297                     return false;298                 if (_lc.IsBackgrpund || _lc.Ismove)299                 {300                     int _c = checkindex + 1;301                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.LEFT))302                     {303                         return true;304                     }305                     _c = checkindex + 1;306                     if (CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.RIGHT))307                     {308                         return true;309                     }310                     else311                     {312                         _c = checkindex;313                         return CheckNode(_lc, _c, NODETYPE.OTHERNODE, TODIRECTION.DOWN);314                     }315                 }316                 else317                 {318                     if (LianLianHelp.LianLelp.Isalike(_lc, thisllc))319                     {320                         ClickNode(_lc, thisllc);321                         return true;322                     }323                     else324                         return false;325                 }326             }327 328         }329 330         private bool CheckValue(int[] values, ref  int count)331         {332             foreach (int i in values)333             {334                 count += i;335             }336             int _index = count / values.Length;337             foreach (int i in values)338             {339                 if (Math.Abs(i - _index) >= 5)340                 {341                     return false;342                 }343             }344             return true;345         }346 347         private void ClickNode(LianLianClass lc1, LianLianClass lc2)348         {349             lc1.Ismove = true;350             lc2.Ismove = true;351             LianLianHelp.MoveMouse(lc1.ThisPoint.X, lc1.ThisPoint.Y);352             Thread.Sleep(100);353             LianLianHelp.LeftClick(lc1.ThisPoint.X, lc1.ThisPoint.Y);354             Thread.Sleep(100);355             LianLianHelp.MoveMouse(lc2.ThisPoint.X, lc2.ThisPoint.Y);356             Thread.Sleep(100);357             LianLianHelp.LeftClick(lc2.ThisPoint.X, lc2.ThisPoint.Y);358             Thread.Sleep(SleepTime);359             Console.WriteLine("Click(" + lc1.ListPoint.X + "," + lc1.ListPoint.Y + ") and (" + lc2.ListPoint.X + "," + lc2.ListPoint.Y + ")");360         }361 362         private void button2_Click(object sender, EventArgs e)363         {364             Application.Exit();365         }366 367         private void radioButton2_Click(object sender, EventArgs e)368         {369             RadioButton rdo = sender as RadioButton;370             int index = int.Parse(rdo.Tag.ToString());371             Random r = new Random();372             switch (index)373             {374                 case 0:375                     SleepTime = 10;376                     break;377                 case 1: SleepTime = r.Next(500, 2000); break;378                 case 2: SleepTime = r.Next(500, 4000); break;379                 case 3: SleepTime = r.Next(500, 8000); break;380             }381             button1.Enabled = true;382         }383 384         private void Form1_Load(object sender, EventArgs e)385         {386             using (StreamReader reader = new StreamReader(Application.StartupPath + "\\config.txt"))387             {388                 string _name = reader.ReadToEnd().Trim();389                 if (_name.Length > 0)390                     gamename = reader.ReadToEnd();391             }392             LianLianHelp.RegisterHotKey(this.Handle, 800, 0, Keys.F10);393             LianLianHelp.RegisterHotKey(this.Handle, 801, 0, Keys.F11);394             LianLianHelp.RegisterHotKey(this.Handle, 802, 0, Keys.F6);395             LianLianHelp.RegisterHotKey(this.Handle, 803, 0, Keys.F7);396         }397 398         protected override void WndProc(ref Message m)399         {400             switch (m.Msg)401             {402                 case 0x0312:    //这个是window消息定义的注册的热键消息 403                     if (m.WParam.ToString().Equals("800"))404                     {405                         if (!isstart)406                         {407                             isstart = true;408                             this.button1.Enabled = false;409                             // Start();410                             Thread th = new Thread(Start);411                             th.IsBackground = true;412                             th.Start();413                         }414                     }415                     else if (m.WParam.ToString().Equals("801"))416                     {417                         isstop = true;418                     }419                     else if (m.WParam.ToString().Equals("802"))420                     {421                         this.Hide();422                     }423                     else if (m.WParam.ToString().Equals("803"))424                     {425                         this.Show();426                     }427 428                     break;429             }430             base.WndProc(ref m);431         }432 433         private void Form1_FormClosing(object sender, FormClosingEventArgs e)434         {435             LianLianHelp.UnregisterHotKey(this.Handle, 800);436             LianLianHelp.UnregisterHotKey(this.Handle, 801);437             LianLianHelp.UnregisterHotKey(this.Handle, 802);438             LianLianHelp.UnregisterHotKey(this.Handle, 803);439         }440     }441 442 }
View Code
  1 namespace LianLianHelp  2 {  3     partial class Form1  4     {  5         /// <summary>  6         /// 設計工具所需的變數。  7         /// </summary>  8         private System.ComponentModel.IContainer components = null;  9  10         /// <summary> 11         /// 清除任何使用中的資源。 12         /// </summary> 13         /// <param name="disposing">如果應該處置 Managed 資源則為 true,否則為 false。</param> 14         protected override void Dispose(bool disposing) 15         { 16             if (disposing && (components != null)) 17             { 18                 components.Dispose(); 19             } 20             base.Dispose(disposing); 21         } 22  23         #region Windows Form 設計工具產生的程式碼 24  25         /// <summary> 26         /// 此為設計工具支援所需的方法 - 請勿使用程式碼編輯器 27         /// 修改這個方法的內容。 28         /// </summary> 29         private void InitializeComponent() 30         { 31             this.button1 = new System.Windows.Forms.Button(); 32             this.radioButton1 = new System.Windows.Forms.RadioButton(); 33             this.radioButton2 = new System.Windows.Forms.RadioButton(); 34             this.radioButton3 = new System.Windows.Forms.RadioButton(); 35             this.radioButton4 = new System.Windows.Forms.RadioButton(); 36             this.button2 = new System.Windows.Forms.Button(); 37             this.groupBox1 = new System.Windows.Forms.GroupBox(); 38             this.groupBox2 = new System.Windows.Forms.GroupBox(); 39             this.label4 = new System.Windows.Forms.Label(); 40             this.label3 = new System.Windows.Forms.Label(); 41             this.label2 = new System.Windows.Forms.Label(); 42             this.label1 = new System.Windows.Forms.Label(); 43             this.groupBox1.SuspendLayout(); 44             this.groupBox2.SuspendLayout(); 45             this.SuspendLayout(); 46             //  47             // button1 48             //  49             this.button1.Enabled = false; 50             this.button1.Location = new System.Drawing.Point(42, 136); 51             this.button1.Name = "button1"; 52             this.button1.Size = new System.Drawing.Size(75, 23); 53             this.button1.TabIndex = 0; 54             this.button1.Text = "开始"; 55             this.button1.UseVisualStyleBackColor = true; 56             this.button1.Click += new System.EventHandler(this.button1_Click); 57             //  58             // radioButton1 59             //  60             this.radioButton1.AutoSize = true; 61             this.radioButton1.Location = new System.Drawing.Point(9, 20); 62             this.radioButton1.Name = "radioButton1"; 63             this.radioButton1.Size = new System.Drawing.Size(47, 16); 64             this.radioButton1.TabIndex = 1; 65             this.radioButton1.Tag = "0"; 66             this.radioButton1.Text = "闪电"; 67             this.radioButton1.UseVisualStyleBackColor = true; 68             this.radioButton1.Click += new System.EventHandler(this.radioButton2_Click); 69             //  70             // radioButton2 71             //  72             this.radioButton2.AutoSize = true; 73             this.radioButton2.Checked = true; 74             this.radioButton2.Location = new System.Drawing.Point(72, 20); 75             this.radioButton2.Name = "radioButton2"; 76             this.radioButton2.Size = new System.Drawing.Size(47, 16); 77             this.radioButton2.TabIndex = 2; 78             this.radioButton2.TabStop = true; 79             this.radioButton2.Tag = "1"; 80             this.radioButton2.Text = "烈马"; 81             this.radioButton2.UseVisualStyleBackColor = true; 82             this.radioButton2.Click += new System.EventHandler(this.radioButton2_Click); 83             //  84             // radioButton3 85             //  86             this.radioButton3.AutoSize = true; 87             this.radioButton3.Location = new System.Drawing.Point(135, 20); 88             this.radioButton3.Name = "radioButton3"; 89             this.radioButton3.Size = new System.Drawing.Size(47, 16); 90             this.radioButton3.TabIndex = 3; 91             this.radioButton3.Tag = "2"; 92             this.radioButton3.Text = "脱兔"; 93             this.radioButton3.UseVisualStyleBackColor = true; 94             this.radioButton3.Click += new System.EventHandler(this.radioButton2_Click); 95             //  96             // radioButton4 97             //  98             this.radioButton4.AutoSize = true; 99             this.radioButton4.Location = new System.Drawing.Point(198, 21);100             this.radioButton4.Name = "radioButton4";101             this.radioButton4.Size = new System.Drawing.Size(47, 16);102             this.radioButton4.TabIndex = 4;103             this.radioButton4.Tag = "3";104             this.radioButton4.Text = "蜗牛";105             this.radioButton4.UseVisualStyleBackColor = true;106             this.radioButton4.Click += new System.EventHandler(this.radioButton2_Click);107             // 108             // button2109             // 110             this.button2.Location = new System.Drawing.Point(153, 136);111             this.button2.Name = "button2";112             this.button2.Size = new System.Drawing.Size(75, 23);113             this.button2.TabIndex = 5;114             this.button2.Text = "退出";115             this.button2.UseVisualStyleBackColor = true;116             this.button2.Click += new System.EventHandler(this.button2_Click);117             // 118             // groupBox1119             // 120             this.groupBox1.Controls.Add(this.radioButton4);121             this.groupBox1.Controls.Add(this.radioButton1);122             this.groupBox1.Controls.Add(this.radioButton2);123             this.groupBox1.Controls.Add(this.radioButton3);124             this.groupBox1.Location = new System.Drawing.Point(7, 6);125             this.groupBox1.Name = "groupBox1";126             this.groupBox1.Size = new System.Drawing.Size(260, 45);127             this.groupBox1.TabIndex = 6;128             this.groupBox1.TabStop = false;129             this.groupBox1.Text = "速度";130             // 131             // groupBox2132             // 133             this.groupBox2.Controls.Add(this.label4);134             this.groupBox2.Controls.Add(this.label3);135             this.groupBox2.Controls.Add(this.label2);136             this.groupBox2.Controls.Add(this.label1);137             this.groupBox2.Location = new System.Drawing.Point(5, 58);138             this.groupBox2.Name = "groupBox2";139             this.groupBox2.Size = new System.Drawing.Size(260, 72);140             this.groupBox2.TabIndex = 7;141             this.groupBox2.TabStop = false;142             this.groupBox2.Text = "热键";143             // 144             // label4145             // 146             this.label4.AutoSize = true;147             this.label4.Location = new System.Drawing.Point(135, 45);148             this.label4.Name = "label4";149             this.label4.Size = new System.Drawing.Size(59, 12);150             this.label4.TabIndex = 3;151             this.label4.Text = "停止:F11";152             // 153             // label3154             // 155             this.label3.AutoSize = true;156             this.label3.Location = new System.Drawing.Point(13, 45);157             this.label3.Name = "label3";158             this.label3.Size = new System.Drawing.Size(59, 12);159             this.label3.TabIndex = 2;160             this.label3.Text = "开始:F10";161             // 162             // label2163             // 164             this.label2.AutoSize = true;165             this.label2.Location = new System.Drawing.Point(135, 22);166             this.label2.Name = "label2";167             this.label2.Size = new System.Drawing.Size(53, 12);168             this.label2.TabIndex = 1;169             this.label2.Text = "呼出:F7";170             // 171             // label1172             // 173             this.label1.AutoSize = true;174             this.label1.Location = new System.Drawing.Point(11, 22);175             this.label1.Name = "label1";176             this.label1.Size = new System.Drawing.Size(53, 12);177             this.label1.TabIndex = 0;178             this.label1.Text = "隐藏:F6";179             // 180             // Form1181             // 182             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);183             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;184             this.ClientSize = new System.Drawing.Size(271, 171);185             this.Controls.Add(this.groupBox2);186             this.Controls.Add(this.groupBox1);187             this.Controls.Add(this.button2);188             this.Controls.Add(this.button1);189             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;190             this.Name = "Form1";191             this.Text = "QQ连连看游戏辅助";192             this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);193             this.Load += new System.EventHandler(this.Form1_Load);194             this.groupBox1.ResumeLayout(false);195             this.groupBox1.PerformLayout();196             this.groupBox2.ResumeLayout(false);197             this.groupBox2.PerformLayout();198             this.ResumeLayout(false);199 200         }201 202         #endregion203 204         private System.Windows.Forms.Button button1;205         private System.Windows.Forms.RadioButton radioButton1;206         private System.Windows.Forms.RadioButton radioButton2;207         private System.Windows.Forms.RadioButton radioButton3;208         private System.Windows.Forms.RadioButton radioButton4;209         private System.Windows.Forms.Button button2;210         private System.Windows.Forms.GroupBox groupBox1;211         private System.Windows.Forms.GroupBox groupBox2;212         private System.Windows.Forms.Label label4;213         private System.Windows.Forms.Label label3;214         private System.Windows.Forms.Label label2;215         private System.Windows.Forms.Label label1;216     }217 }
View Code

HelpSource 保存一些数据

 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Drawing; 5  6 namespace LianLianHelp 7 { 8     class HelpSource 9     {10         /// <summary>11         /// 游戏区域相对于窗口偏移12         /// </summary>13         public static Point game_offset = new Point(15, 182);14         /// <summary>15         /// 游戏区域大小16         /// </summary>17         public static Size gameSize = new Size(589, 385);18         /// <summary>19         /// 每个方块大小20         /// </summary>21         public static Size pieceSize = new Size(31, 35);22     }23 }
View Code

LianLianClass 游戏小方格类

 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Drawing; 5  6 namespace LianLianHelp 7 { 8     class LianLianClass 9     {10         private int[] colorNumCount=new int[9]; 11         /// <summary>12         /// 颜色值13         /// </summary>14         public int[] ColorNumCount15         {16             get { return colorNumCount; }17             set { colorNumCount = value; }18         }19 20         private bool isBackgrpund = false;21         /// <summary>22         /// 是否是背景23         /// </summary>24         public bool IsBackgrpund25         {26             get { return isBackgrpund; }27             set { isBackgrpund = value; }28         }29 30         private Point thisPoint;31         /// <summary>32         /// 方块位置33         /// </summary>34         public Point ThisPoint35         {36             get { return thisPoint; }37             set { thisPoint = value; }38         }39 40         private Point listPoint;41         /// <summary>42         /// 数组中的位置43         /// </summary>44         public Point ListPoint45         {46             get { return listPoint; }47             set { listPoint = value; }48         }private bool ismove = false;49         /// <summary>50         /// 是否移除了51         /// </summary>52         public bool Ismove53         {54             get { return ismove; }55             set { ismove = value; }56         }57 58         private TODIRECTION toDirection = TODIRECTION.RIGHT;59 60         internal TODIRECTION ToDirection61         {62             get { return toDirection; }63             set { toDirection = value; }64         }65     }66 }
View Code

LianLianHelp  游戏辅助类

  1 using System;  2 using System.Collections.Generic;  3 using System.Text;  4 using System.Drawing;  5 using System.Windows.Forms;  6 using System.Runtime.InteropServices;  7 using System.Diagnostics;  8   9 namespace LianLianHelp 10 { 11     enum TODIRECTION 12     { 13         LEFT, 14         RIGHT, 15         UP, 16         DOWN 17     } 18  19     enum NODETYPE 20     { 21         SOURCENODE, 22         OTHERNODE 23     } 24  25     class LianLianHelp 26     { 27         private static LianLianHelp lianLelp; 28  29         public static LianLianHelp LianLelp 30         { 31             get 32             { 33                 if (lianLelp == null) 34                 { 35                     lianLelp = new LianLianHelp(); 36                 } 37                 return LianLianHelp.lianLelp; 38             } 39         } 40  41         private LianLianHelp() 42         { 43  44         } 45  46         public void ClearList() 47         { 48             LianList.Clear(); 49         } 50  51         List<List<LianLianClass>> lianList = new List<List<LianLianClass>>(); 52         /// <summary> 53         /// 方块列表 54         /// </summary> 55         public List<List<LianLianClass>> LianList 56         { 57             get { return lianList; } 58             set { lianList = value; } 59         } 60  61  62         public bool Isalike(LianLianClass c1, LianLianClass c2) 63         { 64  65             for (int i = 0; i < 9; i++) 66             { 67                 if (Math.Abs(c1.ColorNumCount[i] - c2.ColorNumCount[i]) > 20) 68                     return false; 69             } 70             return true; 71         } 72  73         public LianLianClass GetLLC(int thisx, int thisy, TODIRECTION toDirection) 74         { 75             LianLianClass lc = GetNextLLC(thisx, thisy, toDirection); 76             if (lc.Ismove == true || lc.IsBackgrpund == true) 77                 lc = GetLLC(lc.ListPoint.X, lc.ListPoint.Y, toDirection); 78             return lc; 79         } 80  81         public LianLianClass GetNextLLC(int thisx, int thisy, TODIRECTION toDirection) 82         { 83             LianLianClass lc = null; 84             switch (toDirection) 85             { 86                 case TODIRECTION.LEFT: 87                     if (thisx == 0) 88                         return null; 89                     else 90                     { 91                         lc = LianList[thisx - 1][thisy]; 92                     } 93                     break; 94                 case TODIRECTION.RIGHT: 95                     if (thisx == 18) 96                         return null; 97                     else 98                     { 99                         lc = LianList[thisx + 1][thisy];100                     }101                     break;102                 case TODIRECTION.UP:103                     if (thisy == 0)104                         return null;105                     else106                     {107                         lc = LianList[thisx][thisy - 1];108 109                     }110                     break;111                 case TODIRECTION.DOWN:112                     if (thisy == 10)113                         return null;114                     else115                     {116                         lc = LianList[thisx][thisy + 1];117                     }118                     break;119             }120             return lc;121         }122 123         public bool CheckISOK()124         {125             for (int x = 0; x < 19; x++)126             {127                 for (int y = 0; y < 11; y++)128                 {129                     LianLianClass llc = LianList[x][y];130                     if (llc.IsBackgrpund)131                     {132                         continue;133                     }134                     if (!llc.Ismove)135                     {136                         return false;137                     }138                 }139             }140             return true;141         }142 143 144         public void PrintScreen(string file)145         {146             Bitmap bit = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);147             Graphics g = Graphics.FromImage(bit);148             g.CopyFromScreen(new Point(0, 0), new Point(0, 0), bit.Size);149             bit.Save(file);150             g.Dispose();151             bit.Dispose();152         }153 154         #region 鼠标155         const int MOUSEEVENTF_MOVE = 0x0001;     // 移动鼠标 156         const int MOUSEEVENTF_LEFTDOWN = 0x0002; //模拟鼠标左键按下 157         const int MOUSEEVENTF_LEFTUP = 0x0004; //模拟鼠标左键抬起 158         const int MOUSEEVENTF_RIGHTDOWN = 0x0008; //模拟鼠标右键按下 159         const int MOUSEEVENTF_RIGHTUP = 0x0010; //模拟鼠标右键抬起 160         const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;// 模拟鼠标中键按下 161         const int MOUSEEVENTF_MIDDLEUP = 0x0040; //模拟鼠标中键抬起 162         const int MOUSEEVENTF_ABSOLUTE = 0x8000; //标示是否采用绝对坐标 163 164         [DllImport("user32.dll", EntryPoint = "GetCursorPos")]//获取鼠标坐标165         private static extern int GetCursorPos(166             ref POINTAPI lpPoint167         );168 169         [System.Runtime.InteropServices.DllImport("user32")]170         private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);171 172         public static void LeftClick(int x, int y)173         {174             mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_ABSOLUTE, x * 65535 / Screen.PrimaryScreen.Bounds.Width, y * 65535 / Screen.PrimaryScreen.Bounds.Height, 0, 0);//点击175             mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_ABSOLUTE, x * 65535 / Screen.PrimaryScreen.Bounds.Width, y * 65535 / Screen.PrimaryScreen.Bounds.Height, 0, 0);//抬起176         }177 178         public static void MoveMouse(int x, int y)179         {180             mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, x * 65535 / Screen.PrimaryScreen.Bounds.Width, y * 65535 / Screen.PrimaryScreen.Bounds.Height, 0, 0);181         }182 183         [StructLayout(LayoutKind.Sequential)]//定义与API相兼容结构体,实际上是一种内存转换184         private struct POINTAPI185         {186             public int X;187             public int Y;188         }189 190         public static Point GetMousePoint()191         {192             LianLianHelp.POINTAPI pointapi = new LianLianHelp.POINTAPI();193             LianLianHelp.GetCursorPos(ref pointapi);194             return new Point(pointapi.X, pointapi.Y);195         }196         #endregion197 198         #region 窗体199         public const int SW_HIDE = 0;200         public const int SW_SHOWNORMAL = 1;201         public const int SW_SHOWMINIMIZED = 2;202         public const int SW_SHOWMAXIMIZED = 3;203         public const int SW_MAXIMIZE = 3;204         public const int SW_SHOWNOACTIVATE = 4;205         public const int SW_SHOW = 5;206         public const int SW_MINIMIZE = 6;207         public const int SW_SHOWMINNOACTIVE = 7;208         public const int SW_SHOWNA = 8;209         public const int SW_RESTORE = 9;210 211         [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]212         public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);213         [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]214         public static extern bool SetForegroundWindow(IntPtr hWnd);//设置此窗体为活动窗体215         [DllImport("user32.dll")]216         [return: MarshalAs(UnmanagedType.Bool)]217         private static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);218 219         [StructLayout(LayoutKind.Sequential)]220         private struct RECT221         {222             public int Left; //最左坐标223             public int Top; //最上坐标224             public int Right; //最右坐标225             public int Bottom; //最下坐标226         }227 228         [DllImport("user32.dll", CharSet = CharSet.Auto)]229         public static extern int MoveWindow(IntPtr hWnd, int x, int y, int nWidth, int nHeight, bool BRePaint);230 231         public static int SetWindowSize(IntPtr hWnd, int x, int y, int width, int height)232         {233             return MoveWindow(hWnd, x, y, width, height, false);234         }235 236         public static int GetWindowHandle(string name)237         {238             Process[] ps = Process.GetProcessesByName(name);239             return ps[0].MainWindowHandle.ToInt32();240         }241 242         public static void GetWindowRects(IntPtr hWnd, ref int x1, ref int y1, ref int x2, ref int y2)243         {244             RECT rect = new RECT();245             GetWindowRect(hWnd, ref rect);246             x1 = rect.Left;247             y1 = rect.Top;248             x2 = rect.Right;249             y2 = rect.Bottom;250         }251 252 253         #endregion254 255         #region 热键256         //注册热键的api 257         [DllImport("user32.dll")]258         public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);259         [DllImport("user32.dll")]260         public static extern bool UnregisterHotKey(IntPtr hWnd, int id);261           262        263         #endregion264     }265 }
View Code

 

游戏效果:如果ClickNode不添加时间间隔,瞬间全消

 

c#QQ连连看辅助