当前位置: 首页 > web >正文

QQ斗地主刷分工具的源码

本人最近编写了一款QQ斗地主的刷分工具,现将关键代码附上来(代码中有注释),以供参考。本人新手,请大侠切勿耻笑

。成品软件可以点击此处下载:360安全云盘 - 404

下面为软件界面的截图:

// 获取指定位置的屏幕颜色
COLORREF CQQGameAddInDlg::GetColorAtPos(int nX, int nY)
{
  HDC hdcSrc = ::GetDC(s_hwndQQGame);
  if (NULL == hdcSrc)
  {
    AfxMessageBox(_T("获取设备上下文失败"));
    GetDlgItem(IDC_BUTTON2)->SendMessage(BM_CLICK, 0, 0);
    return -1;
  }
  int nBPP = GetDeviceCaps(hdcSrc, BITSPIXEL) * GetDeviceCaps(hdcSrc, PLANES);
  CRect rect;
  ::GetClientRect(s_hwndQQGame, &rect);
  CImage image;
  if (!image.Create(rect.Width(), rect.Height(), nBPP))
  {
    AfxMessageBox(_T("创建图像对象失败"));
    ::ReleaseDC(s_hwndQQGame, hdcSrc);
    GetDlgItem(IDC_BUTTON2)->SendMessage(BM_CLICK, 0, 0);
    return -1;
  }
  BitBlt(image.GetDC(), 0, 0, rect.Width(), rect.Height(), hdcSrc, rect.left, rect.top, SRCCOPY);
  COLORREF color = image.GetPixel(nX, nY);
  if (-1 == color)
  {
    ReportLog(_T("获取颜色值失败:%u\n"), GetLastError());
    image.ReleaseDC();
    image.Destroy();
    ::ReleaseDC(s_hwndQQGame, hdcSrc);
    return -1;
  }
  ::ReleaseDC(s_hwndQQGame, hdcSrc);
  image.ReleaseDC();
  image.Destroy();
  return color;
}


void CQQGameAddInDlg::OnTimer(UINT_PTR nIDEvent)
{
  // TODO: Add your message handler code here and/or call default
  switch (nIDEvent)
  {
  case FAST_START_GAME_TIMER_ID:
    {
      if (s_colorFastStart == GetColorAtPos(s_nFastStartX, s_nFastStartY))
      {
        KillTimer(FAST_START_GAME_TIMER_ID);
        ClickAtPos(s_nFastStartX, s_nFastStartY);
        TCHAR szTime[9] = {0};
        _strtime(szTime);
        ReportLog(_T("快速开始游戏 %s\n"), szTime);
        Sleep(REST_TIME_AFTER_SEND_COMMAND);
        SetTimer(FAST_START_GAME_TIMER_ID, TIMER_INTERVAL, NULL);
      }
    }
    break;
  case START_GAME_TIMER_ID:
    {
      COLORREF colorStart = GetColorAtPos(s_nStartX, s_nStartY);
      BOOL bStart = s_colorStart == colorStart;
      // 主账户多增加了两个判断
      if (!bStart && s_nBrowserType == 0)
      {
        bStart = s_colorMajorStart1 == colorStart;
        if (!bStart)
        {
          bStart = s_colorMajorStart2 == colorStart;
        }
      }

      if (bStart)
      {
        KillTimer(START_GAME_TIMER_ID);
        if (BST_CHECKED == ((CButton *)GetDlgItem(IDC_CHECK1))->GetCheck())
        {
          // 主账户计时
          if (0 == s_timeStartGame)
          {
            time(&s_timeStartGame);
          }
          else
          {
            time_t timeStartGame = 0;
            time(&timeStartGame);
            CTime time(timeStartGame - s_timeStartGame);
            s_timeStartGame = timeStartGame;
            CString strTimeDuration = time.FormatGmt(_T("上一局牌持续时间:%H:%M:%S\n"));
            ReportLog(strTimeDuration);
          }

        }
        ClickAtPos(s_nStartX, s_nStartY);
        TCHAR szTime[9] = {0};
        _strtime(szTime);
        ReportLog(_T("开始第%d局游戏 %s\n"), ++s_nPKTimes, szTime);
        Sleep(REST_TIME_AFTER_SEND_COMMAND);
        SetTimer(START_GAME_TIMER_ID, TIMER_INTERVAL, NULL);
        KillTimer(TUOGUAN_TIMER_ID);    // 叫分前禁用托管
      }
      else
      {
        TRACE(_T("开始游戏的颜色为:%ul\n"), colorStart);
      }
    }
    break;
  case SANFEI_TIMER_ID:
    {
      if (s_colorSanfei == GetColorAtPos(s_nSanFeiX, s_nSanFeiY))
      {
        KillTimer(SANFEI_TIMER_ID);
        ClickAtPos(s_nSanFeiX, s_nSanFeiY);
        TCHAR szTime[9] = {0};
        _strtime(szTime);
        ReportLog(_T("三分: %s\n"), szTime);
        Sleep(REST_TIME_AFTER_SEND_COMMAND);
        SetTimer(SANFEI_TIMER_ID, TIMER_INTERVAL, NULL);
        if (BST_CHECKED == ((CButton *)GetDlgItem(IDC_CHECK1))->GetCheck())
        {
          // 主账号开始托管
          SetTimer(TUOGUAN_TIMER_ID, TIMER_INTERVAL, NULL);
        }
        SetTimer(SANFEI_TIMER_ID, TIMER_INTERVAL, NULL);
      }
    }
    break;
    case BUCHU_TIMER_ID:
    {
      if (s_colorBuChu1 == GetColorAtPos(s_nBuChuX, s_nBuChuY) || s_colorBuChu2 == GetColorAtPos(s_nBuChuX, s_nBuChuY))
      {
        KillTimer(BUCHU_TIMER_ID);
        ClickAtPos(s_nBuChuX, s_nBuChuY);
        TCHAR szTime[9] = {0};
        _strtime(szTime);
        ReportLog(_T("不出: %s\n"), szTime);
        Sleep(REST_TIME_AFTER_SEND_COMMAND);
        SetTimer(BUCHU_TIMER_ID, TIMER_INTERVAL, NULL);
      }
    }
    break;
    case BUJIAO_TIMER_ID:
    {
      if (s_colorBuJiao == GetColorAtPos(s_nBuJiaoX, s_nBuJiaoY))
      {
        KillTimer(BUJIAO_TIMER_ID);
        ClickAtPos(s_nBuJiaoX, s_nBuJiaoY);
        TCHAR szTime[9] = {0};
        _strtime(szTime);
        ReportLog(_T("不叫: %s\n"), szTime);
        Sleep(REST_TIME_AFTER_SEND_COMMAND);
        SetTimer(BUJIAO_TIMER_ID, TIMER_INTERVAL, NULL);
      }
    }
    break;
    case TUOGUAN_TIMER_ID:
    {
      if (s_colorTuoGuan == GetColorAtPos(s_nTuoGuanX, s_nTuoGuanY))
      {
        KillTimer(TUOGUAN_TIMER_ID);
        ClickAtPos(s_nTuoGuanX, s_nTuoGuanY);
        TCHAR szTime[9] = {0};
        _strtime(szTime);
        ReportLog(_T("托管: %s\n"), szTime);
        Sleep(REST_TIME_AFTER_SEND_COMMAND);
      }
    }
    break;
    case LIANSHENG_TIMER_ID:
      {
        if (s_colorLianSheng == GetColorAtPos(s_nLianShengX, s_nLianShengY))
        {
          KillTimer(LIANSHENG_TIMER_ID);
          ClickAtPos(s_nLianShengX, s_nLianShengY);
          TCHAR szTime[9] = {0};
          _strtime(szTime);
          ReportLog(_T("连剩五局: %s\n"), szTime);
          Sleep(REST_TIME_AFTER_SEND_COMMAND);
          SetTimer(LIANSHENG_TIMER_ID, TIMER_INTERVAL, NULL);
        }
      }
      break;
    case TUO_GUAN_BUG_TIMER_ID:
      {
        // 托管时不出牌时的BUG
        if (s_colorTuoGuanBug == GetColorAtPos(s_nTuoGuanBugX, s_nTuoGuanBugY))
        {
          KillTimer(TUO_GUAN_BUG_TIMER_ID);
          KillTimer(TUOGUAN_TIMER_ID);    //  取消托管
          Beep(32767, 1000);
          TCHAR szTime[9] = {0};
          _strtime(szTime);
          ReportLog(_T("托管不出牌BUG: %s\n"), szTime);
          Sleep(REST_TIME_AFTER_SEND_COMMAND);
          ClickAtPos(s_nTuoGuanBugQuXiaoTuoGuanX, s_nTuoGuanBugQuXiaoTuoGuanY);  // 取消托管
          ReportLog(_T("取消托管\n"));
          Sleep(REST_TIME_AFTER_SEND_COMMAND);
          ClickAtPos(s_nTuoGuanBugClickX, s_nTuoGuanBugClickX);  // 选牌
          ReportLog(_T("选牌\n"));
          Sleep(REST_TIME_AFTER_SEND_COMMAND);
          ClickAtPos(s_nTuoGuanBugChuPaiX, s_nTuoGuanBugChuPaiY);    // 出牌
          ReportLog(_T("出牌\n"));
          Sleep(REST_TIME_AFTER_SEND_COMMAND);
          SetTimer(TUO_GUAN_BUG_TIMER_ID, TIMER_INTERVAL, NULL);
          SetTimer(TUOGUAN_TIMER_ID, TIMER_INTERVAL, NULL);      // 恢复托管
        }
      }
      break;
    case PREVIEW_GAEM_TIME_ID:
      {
        KillTimer(PREVIEW_GAEM_TIME_ID);
        CRect rectClient;
        GetClientRect(&rectClient);
        CRect rectRedt;
        m_redtLog.GetWindowRect(&rectRedt);
        ScreenToClient(&rectRedt);
        rectClient.top = rectRedt.bottom;
        InvalidateRect(&rectClient);
        SetTimer(PREVIEW_GAEM_TIME_ID, TIMER_INTERVAL, NULL);
      }
      break;
  }
  CDialogEx::OnTimer(nIDEvent);
}


// 指定位置单击
int CQQGameAddInDlg::ClickAtPos(int nX, int nY)
{
  ::SendMessage(s_hwndQQGame, WM_LBUTTONDOWN, MK_LBUTTON, (nY << 16) + nX);
  ::SendMessage(s_hwndQQGame, WM_LBUTTONUP, 0, (nY << 16) + nX);
  return 0;


  int nX1 = 0, nY1 = 0;    // 转化后的坐标
  int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  nX1 = nX * (65535. / nScreenWidth );
  nY1 = nY * (65535. / nScreenHeight);
  mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, nX1, nY1, 0, NULL);
  mouse_event(MOUSEEVENTF_LEFTDOWN, nX1, nY1, 0, NULL);
  mouse_event(MOUSEEVENTF_LEFTUP, nX1, nY1, 0, NULL);
  return 0;
}

http://www.xdnf.cn/news/10979.html

相关文章:

  • 20个BT下载网站,BT种子网站
  • Android修行手册 - TextureView和SurfaceView的属性方法以及示例
  • 老板口中的一区二区是什么意思?
  • 列表滚动底部加载下一页
  • EJB进行开发项目
  • 使用 Version Catalogs统一配置版本 (Gradle 7.0+ 特性)
  • 每天总结一个html标签——area与map标签
  • 终极陷阱:Java序列化漏洞的内爆原理与防御体系重建
  • 6.3本日总结
  • Python-nuitka
  • LARWINER拉威兒艺术珠宝携手郭培GUOPEI高定服装 共谱「宝光凝粹,锦绣华裳」
  • 依赖注入-@Resource和@Autowired
  • 多数据库学习之星瑞格[SinoDB]数据库安装部署指南
  • CppCon 2014 学习:CONVERGENT EVOLUTION
  • Modbus转Ethernet IP网关助力罗克韦尔PLC数据交互
  • Ubuntu系统 | 本地部署ollama+deepseek
  • 青少年近视防控的科学抉择:长期佩戴与间断使用的深度解析
  • MicroPython+ESP32 连接接WIFI
  • 【散刷】二叉树基础OJ题(二)
  • 基于VLC的Unity视频播放器(四)
  • 如何写一条高效分页 SQL?
  • RK3568驱动指南|第十二篇 GPIO子系统-第130章 GPIO的调试方法
  • 数据安全管理进阶:81页 2024数据安全典型场景案例集【附全文阅读】
  • MyBatis常用注解全解析:从基础CRUD到高级映射
  • Shell脚本编程入门与实战指南
  • Qwen2.5-VL 视觉编码器的SwiGLU
  • IT运维工具的选择标准有哪些?
  • [蓝桥杯]求解台阶问题
  • PCI DSS培训记录
  • 便携式雷达信号模拟器,定义复杂电磁环境模拟新标准