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

网站建设高校/seo优化推广公司

网站建设高校,seo优化推广公司,广州市海珠区建设和市政局网站,百度小程序有什么用1.背景 想对一个MFC程序做自动压测功能,根据判断程序界面某块区域是否达到预定状态,来自动执行鼠标点击或者键盘输入的操作,以解决测试人员需要重复手动压测问题。 1.涉及的技术 串口控制,基于MFC橡皮筋类(CRectTracker)做一个…
1.背景

想对一个MFC程序做自动压测功能,根据判断程序界面某块区域是否达到预定状态,来自动执行鼠标点击或者键盘输入的操作,以解决测试人员需要重复手动压测问题。

1.涉及的技术

串口控制,基于MFC橡皮筋类(CRectTracker)做一个简单的截图对话框,GDI,模拟鼠标点击(mouse_event),模拟键盘输入(keybd_event),MD5等

2.串口控制继电器上下电

如何你要压测的程序需要通过控制USB上下电,可用串口控制继电器来达到此目的。

  • 以下是串口初始化的代码
bool CComTest::InitialCom(int iComID, int iComPort, DWORD iBaudRate)
{if (iComPort < 1 || iComPort > 255){return FALSE;}if (INVALID_HANDLE_VALUE != m_hCom){CloseCom(iComID);}if (INVALID_HANDLE_VALUE != m_hCom){CloseHandle(m_hCom);}m_iComPort = iComPort;      //串口通信端口m_iBaudRate = iBaudRate;    //串口通信速率DCB Dcb;CString str;COMMTIMEOUTS TimeOut;int Data = 8;int Stop = 0;int Parity = 0;str.Format(_T("COM%d"), iComPort);m_hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);if (m_hCom == INVALID_HANDLE_VALUE){return FALSE;}GetCommState(m_hCom, &Dcb);Dcb.BaudRate = iBaudRate;Dcb.ByteSize = Data;Dcb.StopBits = Stop;Dcb.Parity = Parity;if (!SetCommState(m_hCom, &Dcb)){CloseHandle(m_hCom);m_hCom[iComID] = INVALID_HANDLE_VALUE;return FALSE;}memset(&TimeOut, 0, sizeof(TimeOut));TimeOut.ReadIntervalTimeout = MAXDWORD;SetCommTimeouts(m_hCom[iComID], &TimeOut);SetupComm(m_hCom, 1024, 1024);PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);return TRUE;
}
  • 读取串口:
DWORD CComTest::ReadCom(int ComNo, BYTE *pBuff, int nCount)
{if (m_hCom == INVALID_HANDLE_VALUE){return 0;}DWORD read = 0;ReadFile(m_hCom, pBuff, nCount, &read, NULL);return read;
}

写串口

BOOL CComTest::WriteCom(int ComNo, BYTE *pBuff, int nCount)
{if (m_hCom == INVALID_HANDLE_VALUE){return FALSE;}DWORD written = 0;BOOL ret = WriteFile(m_hCom, pBuff, nCount, &written, NULL);return ret;
}

发串口命令示例

BYTE pData[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };WriteCom(m_iComID, pData, 6);

继电器控制命令需参考具体供应商提供的使用文档。

3.程序界面状态监控(截图对话框的实现)

想要通过检测某块区域是否达到预设的状态来自动执行被压测程序的下一步动作,可在压测前将被压测程序执行到预定状态,然后截取该区域的位图并保存,在压测时不停的检测该区域位图,和前面保存的位图做对比(MD5),如果MD5一致则执行模拟点击或模拟输入动作。

  • 截图对话框的OnInitDialog函数代码如下
BOOL CCaptureDlg::OnInitDialog()
{CDialog::OnInitDialog();copyScreenToBitmap(m_ScreenBmp);    //将屏幕内容拷贝到Bitmap类型的对象中//获取屏幕当前分辨率的宽度和高度(以像素为单位,传递参数不同X,Y)int screenWidth = GetSystemMetrics(SM_CXSCREEN);int screenHeight = GetSystemMetrics(SM_CYSCREEN);//调用MoveWindow或者SetWindowPos将当前的窗口设置成与屏幕大小相同//使用两个,软件写好后要使用SetWindowPos,但使用SetWindowPos设置成顶层窗口就不能调试了,使用MoveWindow进行调试MoveWindow(-3, -3, screenWidth + 6, screenHeight + 6);  //比屏幕膜大3个像素不然白边出现,好看一些//SetWindowPos(&wndTopMost, -3, -3, screenWidth + 6, screenHeight + 6, SWP_SHOWWINDOW);//橡皮筋类的操作m_rectTracker.m_nStyle = CRectTracker::resizeOutside | CRectTracker::dottedLine;    //矩形框虚线m_rectTracker.m_rect.SetRect(0, 0, 0, 0);           //初始化矩形大小return TRUE;  // return TRUE unless you set the focus to a control
}

m_ScreenBmp会保存截图对话框显示前的屏幕实时位图。

  • 截图对话框背景显示原来屏幕的背景:
BOOL CCaptureDlg::OnEraseBkgnd(CDC* pDC)
{//将bitmap对象作为背景画到对话框上//创建内存DCCDC memDC;memDC.CreateCompatibleDC(pDC);      //使内存DC与pDC兼容memDC.SelectObject(&m_ScreenBmp);   //选入设备环境//将内容从内存DC拷贝到pDC中(本模态对话框窗口的DC)CRect rect;GetClientRect(&rect);       //获取对话框大小,在初始化时设置了pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);  //将内容从内存DC拷贝到pDC中memDC.DeleteDC();       //释放return TRUE;            //直接在此返回,不进行下一步操作,否则就画不上了return CDialog::OnEraseBkgnd(pDC);
}
  • 鼠标消息处理,使橡皮筋对象矩形可操作:
void CCaptureDlg::OnLButtonDown(UINT nFlags, CPoint point)
{//如果点击绘制橡皮筋区域的外部,重新构建一个可拖拽的区域if (m_rectTracker.HitTest(point) == CRectTracker::hitNothing){m_rectTracker.TrackRubberBand(this, point, TRUE);}else{//点击在了区域内部,允许用户大小调整进行区域描画m_rectTracker.Track(this, point, TRUE);m_rectTracker.m_rect.NormalizeRect();       //NormalizeRect可以进行左右上下值调整,从右下向左上框柱}Invalidate(TRUE);       //更新,使WM_PAINT描画消息触发CDialog::OnLButtonDown(nFlags, point);
}
  • 修改橡皮筋框类光标的形态:
BOOL CCaptureDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{//如果传递的是本窗口,SetCursor成功了if (pWnd == this && m_rectTracker.SetCursor(this, nHitTest)){SetCursor(LoadCursor(NULL, IDC_CROSS));return TRUE;}else{return CDialog::OnSetCursor(pWnd, nHitTest, message);}
}
  • 在OnPaint中实时显示橡皮筋框
void CCaptureDlg::OnPaint()
{//CPaintDC只适合OnPaint里面,所以使用GetDC来获取DC,进行描绘CDC *pDC = GetDC();m_rectTracker.Draw(pDC);ReleaseDC(pDC);     //get与release成对使用
}
  • 双击时将橡皮筋对话框坐标和大小保存,并此区域内的对话框未显示前的屏幕位图保存为图片
void CCaptureDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{// 保存双击时坐标m_startPointX = point.x;m_startPointY = point.y;//如果双击在了矩形区域的内部就进行保存工作if (m_rectTracker.HitTest(point) != CRectTracker::hitMiddle){       MessageBox(_T("截图失败,请重新截图!"));return;}CDC *pDC = GetDC();CDC memDC;memDC.CreateCompatibleDC(pDC);memDC.SelectObject(&m_ScreenBmp);CRect rect;rect = m_rectTracker.m_rect;CBitmap mBmp, *pOldBmp = NULL;mBmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());m_rectInfo.m_Top1 = rect.top;m_rectInfo.m_Bottom1 = rect.bottom;m_rectInfo.m_Left1 = rect.left;m_rectInfo.m_Right1 = rect.right;CDC dstDC;dstDC.CreateCompatibleDC(pDC);pOldBmp = dstDC.SelectObject(&mBmp);//内容拷贝到目标,目标肯定比屏幕小,所以坐标0,0,宽高用户选择的,rect.left, rect.top是源缓冲区的坐标dstDC.BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, rect.left, rect.top, SRCCOPY);CImage Img;Img.Attach(mBmp);                   //关联CString strModuleCapturePath;CString strCapturePath = "你想要保存的路径\\capture1.jpg";Img.Save(strCapturePath );      //保存地址mBmp.DeleteObject();memDC.DeleteDC();dstDC.DeleteDC();ReleaseDC(pDC);//保存完了后,说明本次截图操作完成了,要把当前显示的模态对话框,全屏的对话框关闭CDialog::OnCancel();
}
  • 以上步骤可实现压测前某块区域的位图、区域和双击坐标的保存,以下函数可截取屏幕某个区域的位图并保存到本地:
void CCaptureDlg::Screen(CRect cRect, int iNumber)
{CRect rect = cRect;CDC *pDC;//屏幕DCpDC = CDC::FromHandle(::GetDC(NULL));//获取当前整个屏幕DCint BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式CDC memDC;//内存DCmemDC.CreateCompatibleDC(pDC);CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmapmemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DCmemDC.BitBlt(0, 0, rect.Width(), rect.Height(), pDC, rect.left, rect.top, SRCCOPY);//备注CImage Img;Img.Attach(memBitmap);                  //关联CString strCapturePath = _T("你想要保存的路径\\capture1.jpg");memDC.SelectObject(oldmemBitmap);memDC.DeleteDC();                   ::ReleaseDC(NULL, pDC->m_hDC);      
}
4.模拟鼠标点击

可通过以下代码来实现:

SetCursorPos(m_strPointX, m_strPointY);
mouse_event(MOUSEEVENTF_LEFTDOWN, m_strPointX, m_strPointY, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, m_strPointX, m_strPointY, 0, 0);
5.模拟键盘输入

比如想在某个编辑框中自动输入字符串,可使用前面叙述的截图对话框截取编辑框区域,并通过模拟鼠标点击将光标焦点移动到编辑框内(SetCursorPos的坐标使用双击截图对话框时保存的坐标)

// 截取编辑框时,双击的坐标
SetCursorPos(m_strPointX, m_strPointY);
mouse_event(MOUSEEVENTF_LEFTDOWN, m_strPointX, m_strPointY, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, m_strPointX, m_strPointY, 0, 0);
char szImput[10] = "123456789";
keybd_event(szImput[0], 0, 0, 0);
...
keybd_event(szImput[9], 0, 0, 0
http://www.jmfq.cn/news/5353201.html

相关文章:

  • 杭州seo网站建设/网页设计模板网站
  • 莱芜市住房和城乡建设厅网站/中国站长工具
  • 襄樊北京网站建设/seo推广编辑
  • 重庆网站建设快速建站/免费的网站推广
  • 富利建设集团有限公司网站/自媒体发布软件app
  • 机关网站建设工程总结/中国十大电商平台
  • 西安借贷购物网站建设/公司企业网站制作需要多少钱
  • 漯河住房和城乡建设局网站/徐州网站设计
  • 工程建设招标网都有哪些网站/江苏营销型网站建设
  • 网站建设合同印花税税目/搜索引擎app
  • 洛阳市河阳建设工程有限公司网站/南宁正规的seo费用
  • 青岛商业网站建设/搜索引擎推广一般包括哪些
  • 网站建设创业公司策划方案/详情页页面页面
  • 石家庄网站建设找汉狮/代写软文
  • 美甲网站建设素材/宁波seo排名优化价格
  • 湖州北京网站建设/百度关键字排名软件
  • 网站建设与组织管理/搜狗登录入口
  • 服装商城网站建设方案/互联网推广渠道有哪些
  • 福建省建设厅网站 企业/在线网络培训平台
  • 安徽观元建设有限公司网站/百度推广热线电话
  • 网站建设 模块/外贸网站免费推广b2b
  • 西安网站建设选任我行网络/营销必备十大软件
  • 河南住房与城乡建设部网站/网页百度
  • 网站建设会议/百度推广登录入口登录
  • 长春企业网站建设公司/上海网络seo优化公司
  • 莆田建设银行官方网站/关键词生成器 在线
  • 长春科技网站建设/竞价广告点击软件
  • 阿里巴巴网站建设的态度虚心/seo 推广教程
  • 渑池县建设局网站/seo排名优化推广
  • 深圳知名网站建设价格/网站联盟