C#外掛QQ找茬輔助源碼,早期開發

          這是一款幾年前開發的工具,當年作為一民IT純屌,為了當年自己心目中的一位女神熬夜開發完成。女神使用后找茬等級瞬間從眼明手快升級為三只眼。。。每次看到這個就會想起那段屌絲與女神的回憶。今天特地把代碼更新了一下,支持最新版的《大家來找茬》。下面上運行的截圖,源碼在本文最后(對不起了,與我對戰的那位玩家)

          C#外掛QQ找茬輔助源碼,早期開發
          C#外掛QQ找茬輔助源碼,早期開發


          這個工具的主要運行流程很簡單:游戲截圖-》比較圖片-》標記圖片不同點
          記得當時處理程序截圖和比較圖片的時候比較麻煩,下面是截圖的處理類ScreenCapture:

              /// <summary>
              /// 提供全屏和指定窗口的截圖 以及保存為文件的類
              /// </summary>
              public class ScreenCapture
              {
                  /// <summary>
                  /// 全屏截圖
                  /// </summary>
                  public Image CaptureScreen()
                  {
                      return CaptureWindow(User32.GetDesktopWindow());
                  }
                  /// <summary>
                  /// 指定窗口截圖
                  /// </summary>
                  /// 窗口句柄. (在windows應用程序中, 從Handle屬性獲得)
                  public Image CaptureWindow(IntPtr handle)
                  {
                      IntPtr hdcSrc = User32.GetWindowDC(handle);
                      User32.RECT windowRect = new User32.RECT();
                      User32.GetWindowRect(handle, ref windowRect);
                      int width = windowRect.right – windowRect.left;
                      int height = windowRect.bottom – windowRect.top;
                      IntPtr hdcDest = GDI32.CreateCompatibleDC(hdcSrc);
                      IntPtr hBitmap = GDI32.CreateCompatibleBitmap(hdcSrc, width, height);
                      IntPtr hOld = GDI32.SelectObject(hdcDest, hBitmap);
                      GDI32.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, GDI32.SRCCOPY);
                      GDI32.SelectObject(hdcDest, hOld);
                      GDI32.DeleteDC(hdcDest);
                      User32.ReleaseDC(handle, hdcSrc);
                      Image img = Image.FromHbitmap(hBitmap);
                      GDI32.DeleteObject(hBitmap);
                      return img;
                  }
                  /// <summary>
                  /// 指定窗口截圖 保存為圖片文件
                  /// </summary>
                  public void CaptureWindowToFile(IntPtr handle, string filename, ImageFormat format)
                  {
                      Image img = CaptureWindow(handle);
                      img.Save(filename, format);
                  }
                  /// <summary>
                  /// 全屏截圖 保存為文件
                  /// </summary>
                  public void CaptureScreenToFile(string filename, ImageFormat format)
                  {
                      Image img = CaptureScreen();
                      img.Save(filename, format);
                  }
          
                  /// <summary>
                  /// 輔助類 定義 Gdi32 API 函數
                  /// </summary>
                  private class GDI32
                  {
          
                      public const int SRCCOPY = 0x00CC0020;
                      [DllImport("gdi32.dll")]
                      public static extern bool BitBlt(IntPtr hObject, int nXDest, int nYDest,
                          int nWidth, int nHeight, IntPtr hObjectSource,
                          int nXSrc, int nYSrc, int dwRop);
                      [DllImport("gdi32.dll")]
                      public static extern IntPtr CreateCompatibleBitmap(IntPtr hDC, int nWidth,
                          int nHeight);
                      [DllImport("gdi32.dll")]
                      public static extern IntPtr CreateCompatibleDC(IntPtr hDC);
                      [DllImport("gdi32.dll")]
                      public static extern bool DeleteDC(IntPtr hDC);
                      [DllImport("gdi32.dll")]
                      public static extern bool DeleteObject(IntPtr hObject);
                      [DllImport("gdi32.dll")]
                      public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
                  }
          
                  /// <summary>
                  /// 輔助類 定義User32 API函數
                  /// </summary>
                  private class User32
                  {
                      [StructLayout(LayoutKind.Sequential)]
                      public struct RECT
                      {
                          public int left;
                          public int top;
                          public int right;
                          public int bottom;
                      }
                      [DllImport("user32.dll")]
                      public static extern IntPtr GetDesktopWindow();
                      [DllImport("user32.dll")]
                      public static extern IntPtr GetWindowDC(IntPtr hWnd);
                      [DllImport("user32.dll")]
                      public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDC);
                      [DllImport("user32.dll")]
                      public static extern IntPtr GetWindowRect(IntPtr hWnd, ref RECT rect);
                  }
              }

          圖片比較類ImageComparer:

              /// <summary>
              /// 圖像比較.用于找出兩副圖片之間的差異位置
              /// </summary>
              public class ImageComparer
              {
                  /// <summary>
                  /// 圖像顏色
                  /// </summary>
                  [StructLayout(LayoutKind.Explicit)]
                  private struct ICColor
                  {
                      [FieldOffset(0)]
                      public byte B;
                      [FieldOffset(1)]
                      public byte G;
                      [FieldOffset(2)]
                      public byte R;
                  }
          
                  /// <summary>
                  /// 按5*5大小進行分塊比較兩個圖像.
                  /// </summary>
                  public static List Compare(Bitmap bmp1, Bitmap bmp2)
                  {
                      return Compare(bmp1, bmp2, new Size(5, 5));
                  }
                  /// <summary>
                  /// 比較兩個圖像
                  /// </summary>
                  public static List Compare(Bitmap bmp1, Bitmap bmp2, Size block)
                  {
                      List rects = new List();
                      PixelFormat pf = PixelFormat.Format24bppRgb;
          
                      BitmapData bd1 = bmp1.LockBits(new Rectangle(0, 0, bmp1.Width, bmp1.Height), ImageLockMode.ReadOnly, pf);
                      BitmapData bd2 = bmp2.LockBits(new Rectangle(0, 0, bmp2.Width, bmp2.Height), ImageLockMode.ReadOnly, pf);
          
                      try
                      {
                          unsafe
                          {
                              int w = 0, h = 0;
          
                              while (h < bd1.Height && h < bd2.Height)
                              {
                                  byte* p1 = (byte*)bd1.Scan0 + h * bd1.Stride; byte* p2 = (byte*)bd2.Scan0 + h * bd2.Stride; w = 0; while (w < bd1.Width && w < bd2.Width)
                                  {
                                      //按塊大小進行掃描
                                      for (int i = 0; i < block.Width; i++)
                                      {
                                          int wi = w + i; if (wi >= bd1.Width || wi >= bd2.Width) break;
          
                                          for (int j = 0; j < block.Height; j++)
                                          {
                                              int hj = h + j; if (hj >= bd1.Height || hj >= bd2.Height) break;
          
                                              ICColor* pc1 = (ICColor*)(p1 + wi * 3 + bd1.Stride * j);
                                              ICColor* pc2 = (ICColor*)(p2 + wi * 3 + bd2.Stride * j);
          
                                              if (pc1->R != pc2->R || pc1->G != pc2->G || pc1->B != pc2->B)
                                              {
                                                  //當前塊有某個象素點顏色值不相同.也就是有差異.
          
                                                  int bw = Math.Min(block.Width, bd1.Width - w);
                                                  int bh = Math.Min(block.Height, bd1.Height - h);
                                                  rects.Add(new Rectangle(w, h, bw, bh));
          
                                                  goto E;
                                              }
                                          }
                                      }
                                  E:
                                      w += block.Width;
                                  }
          
                                  h += block.Height;
                              }
                          }
                      }
                      finally
                      {
                          bmp1.UnlockBits(bd1);
                          bmp2.UnlockBits(bd2);
                      }
          
                      return rects;
                  }
              }

          QQ找茬輔助源碼下載
          http://pan.baidu.com/s/1mgoIxBE

          本博客所有文章如無特別注明均為原創

          如果覺得對你有幫助,可以通過下方打賞對作者表示鼓勵

          本文采用知識共享署名-非商業性使用-相同方式共享

          如若轉載,請注明出處:《C#外掛QQ找茬輔助源碼,早期開發》http://www.solariosolutions.com/742.html

          (0)
          打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
          鋒哥的頭像鋒哥管理員
          上一篇 2014年1月22日 09:04
          下一篇 2014年1月24日 12:47

          相關推薦

          發表回復

          登錄后才能評論

          評論列表(11條)

          • 小星
            小星 2016年5月19日 15:08

            還有你的 網盤掛掉了

          • 小星
            小星 2016年5月19日 15:08

            現在的qq找茬 用不了了。。。

            • 鋒哥的頭像
              鋒哥 2016年6月2日 09:20

              @小星年久失修,這個只作為技術研究。能不能用現在我也不知道。

          • 雪萊鳥
            雪萊鳥 2016年4月7日 08:38

            很好很強大,我用按鍵精靈寫的…

          • […] QQ找茬輔助源碼下載:http://www.solariosolutions.com/archives/742.html […]

          • wangjinming
            wangjinming 2014年1月24日 16:48

            為什么我用別的圖片就找不出來啊 :sad:

            • 胖子的頭像
              鋒哥 2014年1月24日 17:32

              @wangjinming你是怎么用的?如果可以把你的使用方式寫上來看看。

            • wangjinming
              wangjinming 2014年1月24日 17:36

              @鋒哥唯一不同就是我的圖片是自動手動截屏的。從美女找茬這個win8 app游戲弄得截圖。好像圖片有點不正規。
              我把這句話
              if (pc1->R != pc2->R || pc1->G != pc2->G || pc1->B != pc2->B)
              改成
              if (Math.Abs(pc1->R-pc2->R) >30 || Math.Abs(pc1->G – pc2->G)>30 || Math.Abs(pc1->B – pc2->B)>30)
              識別出來的情況好一點。

            • 胖子的頭像
              鋒哥 2014年1月24日 20:55

              @wangjinming你先別著急改代碼,你用我的代碼能跑通嗎?另外你想通過修改代碼實現什么功能?

          • […] 在此感謝大牛的分享。 原文地址:進入 […]

          • […] QQ找茬輔助源碼下載:http://www.solariosolutions.com/archives/742.html […]

          国产厨房乱子伦露脸,XXXXAAA欧美,日本 888 XXXX,国产欧美日韩一区二区图片