QQ 静态截图程序模拟实现

截图功能实现(四)自动框选原理 观察其他截图工具比如QQ 当鼠标在某个窗口是会自动把某个窗口高亮显示,这个功能其实还是很有用的它可以加快截图时间,可以更快的完成截图,于是乎我也寻思着如何去实现这个功能,网上翻来翻去好几天都没什么进展,有一天无意间发现一个截图的Demo有这个功能,因此研究了一下,发现其实原理还是挺简单的,兴奋之余也拿出来和大家探讨下。这个功能分为2部分(下面代码是从哪个demo里找的具体谁写的我也不知道,先声明下 阅读详情
导读:
  看到QQ这样的截图实在忍心不住想,是怎以实现的?想了许久想到一个实现法子,下面就让我给大家展示一下,模拟QQ静态模拟截图,我写的代码比较乱,是想到哪写到哪,我想肯实还有比这更简单的办法!!程序实现思路,程序是基于对话框,无标题栏,系统菜单,最小化框,最大化框,无边框....,程序初始化时,把整个桌面屏幕截图,保存下来,然后把对话框设置全屏顶层窗口,然后把保存下来的位图,在OnEraseBkgnd中把整个位图贴到对话框上,然后用像皮筋类选择截取范围,看起来就像操作屏幕一样 。
  下面说说实现细节:
  一、初始化程序,在CCatchScreenDlg构造函数中 初始化像皮筋类和保存全屏位图,
  //初始化像皮筋类
  m_rectTracker.m_nStyle=CRectTracker::resizeInside|CRectTracker::solidLine;
  m_rectTracker.m_rect.SetRect(-1,-1,-1,-1);
  m_hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);
  
  
  m_bDraw=FALSE;
  m_bFirstDraw=FALSE;
  m_bQuit=FALSE;
  m_bShowMsg=FALSE;
  m_startPt=0;
  
  //获取屏幕分辩率
  m_xScreen = GetSystemMetrics(SM_CXSCREEN);
  m_yScreen = GetSystemMetrics(SM_CYSCREEN);
  //截取屏幕到位图中
  CRect rect(0, 0,m_xScreen,m_yScreen);
  m_pBitmap=CBitmap::FromHandle(CopyScreenToBitmap(&rect));
  
  //一定要初始化m_rgn,
  m_rgn.CreateRectRgn(0,0,50,50);
  然后在CCatchScreenDlg::OnInitDialog()中设置对话框成顶层窗口。在 CCatchScreenDlg::OnEraseBkgnd中 用整个桌面位图填充全屏对话框背景
  二、从 CRectTracker中派生了一个CTrack 类在类中重载了DrawTrackerRect函数,在函数中直接 更新窗口,消除拖动和改变大小时的虚线框可能还有更简单的方法,本人能力有限想不出更简的!
  三、从Edit类中派生一个CMyEdit类,用该类的实例对像显示操作提示信息,在 CMyEdit::OnEraseBkgnd中,用一位图填充背景,类中响应了WM_MOUSEMOVE消息,在CMyEdit::OnMouseMove(UINT nFlags, CPoint point) 中移动窗口在左上角和右上角之间来回移动.
  CRect rect;
  GetWindowRect(&rect);
  int xScreen = GetSystemMetrics(SM_CXSCREEN);
  //int ySCreen = GetSystemMetrics(SM_CYSCREEN);
  if(m_bMove)
  {
  //移动到左上角
  MoveWindow(10,10,rect.Width(),rect.Height());
  m_bMove=FALSE;
  }
  else
  {
  //移动到右上角
  MoveWindow(xScreen-180,10,rect.Width(),rect.Height());
  m_bMove=TRUE;
  }
  在主对话框上放置编缉框,然后关联一个CMyEdit的变量,在主对话显示时移动到左上角
  //把对化框设置成全屏顶层窗口
  SetWindowPos(&wndTopMost,0,0,m_xScreen,m_yScreen,SWP_SHOWWINDOW);
  
  //移动操作提示窗口
  CRect rect;
  m_tipEdit.GetWindowRect(&rect);
  m_tipEdit.MoveWindow(10,10,rect.Width(),rect.Height());
  
  //显示操作提示窗口文字
  DrawTip();
  
  //捕获按键消息窗口,将对话框的句柄传递到CCatchScreenApp中
  ((CCatchScreenApp *)AfxGetApp())->m_hwndDlg=m_hWnd;
  四、程序中有两个重要成员函数,一个是画截取矩形时的信息显示在鼠标右上角。
  //显示截取矩形信息
  void CCatchScreenDlg::DrawMessage(CRect &inRect)
  {
  //截取矩形大小信息离鼠标间隔
  const int space=3;
  
  //设置字体颜色大小
  CClientDC dc(this);
  CPoint pt;
  CPen pen(PS_SOLID,1,RGB(147,147,147));
  dc.SetTextColor(RGB(147,147,147));
  CFont font;
  font.CreatePointFont(90,"宋体");
  dc.SelectObject(&font);
  //得到字体宽度和高度
  GetCursorPos(&pt);
  dc.SetBkMode(TRANSPARENT);
  TEXTMETRIC tm;
  int charHeight;
  CSize size;
  int lineLength;
  dc.GetTextMetrics(&tm);
  charHeight = tm.tmHeight+tm.tmExternalLeading;
  size=dc.GetTextExtent("顶点位置 ",strlen("顶点位置 "));
  lineLength=size.cx;
  
  //初始化矩形, 以保证写下六行文字
  CRect rect(pt.x+space,pt.y-charHeight*6-space,pt.x+lineLength+space,pt.y-space);
  int x = GetDeviceCaps(dc, HORZRES);
  int y = GetDeviceCaps(dc, VERTRES);
  //创建临时矩形
  CRect rectTemp;
  //当矩形到达桌面边缘时调整方向和大小
  if((pt.x+rect.Width())>=x)
  {
  //桌面上方显示不下矩形
  rectTemp=rect;
  rectTemp.left=rect.left-rect.Width()-space*2;
  rectTemp.right=rect.right-rect.Width()-space*2;;
  rect=rectTemp;
  }
  if((pt.y-rect.Height())<=0)
  {
  //桌面右方显示不下矩形
  rectTemp=rect;
  rectTemp.top=rect.top+rect.Height()+space*2;;
  rectTemp.bottom=rect.bottom+rect.Height()+space*2;;
  rect=rectTemp;
  
  }
  
  //创建空画刷画矩形
  dc.SelectObject((HBRUSH)GetStockObject(NULL_BRUSH));
  dc.Rectangle(rect);
  
  //在矩形中显示文字
  CString string(" 顶点位置 ");
  dc.TextOut(rect.left,rect.top,string);
  string.Format(" (%d,%d)",inRect.left,inRect.top);
  dc.TextOut(rect.left,rect.top+charHeight,string);
  string=" 矩形大小 ";
  dc.TextOut(rect.left,rect.top+charHeight*2,string);
  string.Format(" (%d,%d)",inRect.Width(),inRect.Height());
  dc.TextOut(rect.left,rect.top+charHeight*3,string);
  string=" 光标坐标 ";
  dc.TextOut(rect.left,rect.top+charHeight*4,string);
  string.Format(" (%d,%d)",pt.x,pt.y);
  dc.TextOut(rect.left,rect.top+charHeight*5,string);
  
  }
  根据鼠标的位置和要显示的字的宽度各高度在鼠标左上角位置处构造一个CRect对像,在CRect中显示矩形信息,同时根据鼠标当前的位置,在左边和上边不能正常显示信息时动态度反转矩形,还有一个类是DrawTip()在鼠标按下、松下是显示相应的操作提示
  //显示操作提示信息
  void CCatchScreenDlg::DrawTip()
  {
  
  //得当前坐标像素,
  CPoint pt;
  GetCursorPos(&pt);
  //当到当前R,G,B,各像素值
  COLORREF color;
  CClientDC dc(this);
  color=dc.GetPixel(pt);
  BYTE rValue,gValue,bValue;
  rValue=GetRValue(color);
  gValue=GetGValue(color);
  bValue=GetGValue(color);
  
  //按格式排放字符串
  CString string;
  CString strTemp;
  string.Format("/r/n/r/n/r/n ?当前像素RGB (%d,%d,%d)/r/n",rValue,gValue,bValue);
  
  if(!m_bDraw&&!m_bFirstDraw)
  {
  strTemp="/r/n ?按下鼠标左键不放选择截取/r/n 范围/r/n/r/n ?按ESC键或鼠标右键退出";
  }
  else
  if(m_bDraw&&m_bFirstDraw)
  {
  strTemp="/r/n ?松开鼠标左键确定截取范围/r/n/r/n ?按ESC键退出";
  }
  else
  if(m_bFirstDraw)
  {
  strTemp="/r/n ?用鼠标左键调整截取范围的/r/n 大小和位置/r/n/r/n?截取范围内双击鼠标左键保存/r/n 图像,
  结束操作/r/n/r/n?点击鼠标右键重新选择";
  }
  string+=strTemp;
  //显示到编缉框中,操作提示窗口
  m_tipEdit.SetWindowText(string);
  }
  程序有点乱,文字都是硬编码写上去的,整个字符串显示在一对话框的编辑出框中,用空格和回车换行来控制摆放格式。
  五、由于对话框中有一个编辑框,并且背景是一张位图,由于程截图时要经常刷新窗口,如果刷新整个窗口的话,编辑框会有很大的闪烁,
  所以只能更新编辑框以外的区域,函数PaintWindow()计算更新区域,并更新窗口
  void CCatchScreenDlg::PaintWindow()
  {
  //获取当全屏对话框窗口大小
  CRect rect1;
  GetWindowRect(rect1);
  //获取编辑框窗口大小
  CRect rect2;
  m_tipEdit.GetWindowRect(rect2);
  CRgn rgn1,rgn2;
  rgn1.CreateRectRgnIndirect(rect1);
  rgn2.CreateRectRgnIndirect(rect2);
  //获取更新区域,就是除了编辑框窗口不更新
  m_rgn.CombineRgn(&rgn1,&rgn2,RGN_DIFF);
  
  InvalidateRgn(&m_rgn);
  }
  六、当然不能忘了方向键来微调截取矩形大小和位置,由于是基于对话框的程序,按键消息,被Windows内部的对话框过程处理了(即在基类中完成了处理,读者可以查看MFC的源代码),或者被发送给子控件进行处理,所以在对话框类中可能利用
  BOOLProcessMessageFilter(int code, LPMSG lpMsg)这个虚函数来过滤或响应菜单和对话框的特定Windows消息在头文件中增加一个类型为HWND,Public成员变量名m_hwndDlg,在构造函数中初始化为NULL;在 CCatchScreenDlg::OnInitDialog()中加入
  ((CWinSunApp*)AfxGetApp())->m_hwndDlg=m_hWnd;
  将对话框的句柄传递到CWinSunApp类中
  //********************************************************************************
  #define SHIFTED 0x8000
  //********************************************************************************
  BOOL CCatchScreenApp::ProcessMessageFilter(int code, LPMSG lpMsg)
  {
  // TODO: Add your specialized code here and/or call the base class
  if(m_hwndDlg!=NULL)
  { //判断消息,如果消息是从对话框发出的或者其子控件发出的,就进行处理
  if((lpMsg->hwnd==m_hwndDlg) || ::IsChild(m_hwndDlg,lpMsg->hwnd))
  {
  //如果消息是WM_KEYDOWN
  //用方向键调整位置
  if(lpMsg->message==WM_KEYDOWN)
  {
  CRect rect(0,0,0,0);
  CCatchScreenDlg * pDlg=(CCatchScreenDlg *)AfxGetMainWnd();
  
  rect=pDlg->m_rectTracker.m_rect;
  if(pDlg->m_bFirstDraw)
  {
  
  //如果Shift键按下则方向键调整大小
  BOOL isShifeDowm=FALSE;
  int nVirtKey;
  nVirtKey = GetKeyState(VK_SHIFT);
  if (nVirtKey &SHIFTED)
  isShifeDowm=TRUE;
  switch(lpMsg->wParam)
  {
  case VK_UP:
  //如果按下Shift,则只调整一边
  if(!isShifeDowm)
  rect.top-=1;
  rect.bottom-=1;
  pDlg->m_rectTracker.m_rect=rect;
  pDlg->PaintWindow();
  break;
  case VK_DOWN:
  rect.top+=1;
  if(!isShifeDowm)
  rect.bottom+=1;
  pDlg->m_rectTracker.m_rect=rect;
  pDlg->PaintWindow();
  break;
  case VK_LEFT:
  if(!isShifeDowm)
  rect.left-=1;
  rect.right-=1;
  pDlg->m_rectTracker.m_rect=rect;
  pDlg->PaintWindow();
  break;
  case VK_RIGHT:
  rect.left+=1;
  if(!isShifeDowm)
  rect.right+=1;
  pDlg->m_rectTracker.m_rect=rect;
  pDlg->PaintWindow();
  break;
  }
  }
  }
  }
  }
  return CWinApp::ProcessMessageFilter(code, lpMsg);
  }
  程序中涉及到像皮筋类的使用,就不多说了,知识库中有许多文章,接着就双击选区保存图片到剪贴板中。就说到这。我嘴笨 , 详细的请参看源文件注释,,有什么问题或您有更好的建意请不要忘了和我联系哦,邮箱: jzlkcn@yahoo.com.cn

本文转自
http://www.vcer.net/6460.html
C++剪切板编程中遇到的一个问题 之前在开发一个新功能的时候,需要将文件的路径信息通过剪切板传递给指定的目标。于是就需要将文件信息写入到剪切板中,获取方则从剪切板中读取想要获取的路径信息。剪切板是通过全局内存来共享数据的,存放数据的内存是通过GlobalAlloc来分配的。问题就出在这个用GlobalAlloc来分配的的内存上,在将文件信息写入到剪切板之后,想当然的就调用GlobalFree来释放之前申请来的内存,于是导致了后续的 阅读详情

相关推荐

Java实现qq截图工具

导读:当今时代是飞速发展的信息时代,人们在对信息的处理中对图像的处理量与日俱增,这一点在文档人员上显得非常突出。 本软件采用Java语言进行模拟qq截图功能,获取屏幕方式灵活,可以获取指定的屏幕,并且可以对获取到的截图进行存储,编辑(添加文字)等操作,对这些操作设置了自定义热键。该软件主要有捕获光标功能,可以指定截取屏幕的区域。软件具有捕捉光标,可以随着鼠标的移动获取屏幕区域,为之后的存储和编辑提供前置条件。图片可以自命名,获取到的截图可以依据当前系统时间进行命名,也可以通过模板(文件名)进行命名,拥有.

孙叫兽的博客 2060

截屏与截长图功能的实现

Demo在GitHub的地址:https://github.com/Hebin320/ScreenShootDemo在优快云上的下载地址:http://download.youkuaiyun.com/detail/hebin320320/9721970在Android开发中,有时候会遇到需要截屏分享到朋友圈或者QQ,截屏有截取当前屏幕,也有需要截取不仅一个屏幕,可能会很长。截取当前屏幕并保存到内存卡的方法:/

小小码农 1万+

基于Java的qq截图工具毕业论文

Storage;The editor毕业设计任务书.......................................... 2摘要.................................................... 61. 绪论............................................... 101.1课题背景......................................... 10。

biyesheji1000的专栏 1173

拷贝屏幕到位图的函数

HBITMAP CCatchScreenDlg::CopyScreenToBitmap(LPRECT lpRect,BOOL bSave)//lpRect 代表选定区域{ HDC       hScrDC, hMemDC;       // 屏幕和内存设备描述表 HBITMAP    hBitmap, hOldBitmap;    // 位图句柄 int       nX, nY, nX2, nY

互联网产品管理、交互、设计、开发、用户体验专栏 1120

截图工具(仿QQ截图,大致功能都已实现)

1、可自识别区域,【右键单击】选中区域 2、工具栏可实现【画线】,【矩形】,【不规则画图】,【保存】,【退出】,保存到剪切板功能 3、【左键拖动】绘制自定义截图 4、自定义截图区域外,【左键拖动】,重新截图 5、自定义截图区域内,【左键拖动】,可改变截图位置,边界可改变大小 6、自定义截图区域内,【右键单击】,可保存文件,分别有png,bmp, jpg格式 7、自定义截图区域内,【左键双击】,可保存截图到剪切板,以便粘贴到其他处 8、鼠标移动,可实现【放大镜】显示当前鼠标位置 9、【关闭】可点击工具栏【关闭按钮】,或者【esc】

MFC桌面截图 类似于qq截图功能

一个桌面截屏程序代码,没有界面,类似于qq截图功能,可以保存bmp格式图片,双击到剪贴板, 不支持截取动态的视频 ctrl+a 截图 alt+q退出程序

【mfc】截屏函数

亲测可用。 VOID _ScreenshotToFile(LPTSTR lpFileName) { DWORD iDeskWidth = GetSystemMetrics(SM_CXSCREEN); DWORD iDeskHeight = GetSystemMetrics(SM_CYSCREEN); HDC hdcMem = CreateCompatibleDC(0); HDC hdcde...

qq_43248127的博客 610

mfc仿QQ截图程序

在vc6.0下用mfc写的仿QQ截图功能的程序

QQ 静态截图程序模拟实现 之 URL记录

QQ 静态截图程序模拟实现:

dvlinker的技术专栏 1151

MFC实现QQ截图工具

MFC实现QQ截图工具, 实现鼠标放大镜,截图区域调整,报错为文件或放入剪切板。

MFC截图工具(仿QQ截图)

1、可自识别区域,【右键单击】选中区域 2、工具栏可实现【画线】,【矩形】,【不规则画图】,【保存】,【退出】,保存到剪切板功能 3、【左键拖动】绘制自定义截图 4、自定义截图区域外,【左键拖动】,重新截图 5、自定义截图区域内,【左键拖动】,可改变截图位置,边界可改变大小 6、自定义截图区域内,【右键单击】,可保存文件,分别有png,bmp, jpg格式 7、自定义截图区域内,【左键双击】,可保存截图到剪切板,以便粘贴到其他处 8、鼠标移动,可实现【放大镜】显示当前鼠标位置 9、【关闭】可点击工具栏【关闭按钮】,或者【esc】

基于Java的QQ屏幕截图工具的设计与实现

基于Java的QQ屏幕截图工具的设计与实现

weixin_46879314的博客 1337

抖音a_bogus参数逆向避坑指南:从环境检测到XHR请求的全流程解析

本文详细解析了抖音a_bogus参数在v1.0.1.19版本下的逆向工程全流程,重点介绍了如何通过PyV8Env框架进行有效的补环境操作,以绕过严格的环境检测。内容涵盖从环境初始化、关键事件触发到模拟XHR请求获取签名的完整步骤,并提供了可运行的Python代码示例和常见检测点的避坑指南,帮助开发者稳定生成有效的a_bogus参数。

tech5的博客 603

【java毕业设计】基于java+BS的QQ屏幕截图工具设计与实现(毕业论文+程序源码)——屏幕截图工具

大家好,今天给大家介绍基于java+BS的QQ屏幕截图工具设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。文章目录: 本软件采用Java语言进行模拟qq截图功能,获取屏幕方式灵活,可以获取指定的屏幕,并且可以对获取到的截图进行存储,编辑(添加文字)等操作,对这些操作设置了自定义热键。该软件主要有捕获光标功能,可以指定截取屏幕的区域。软件具有捕捉光标,可以随着鼠标的移动获取屏幕区域,为之后的存储和编辑提供前置条件。图片可以自命名,获取到的截图可以依据当前系统时间进行命名,也可以通过模板(文件名)进行

m0_66238867的博客 1784

中国高质量夜间灯光数据

中国高质量夜间灯光数据是CnOpenData与吉林高分遥感应用研究院有限公司合作的数据库 ,基于多源夜间灯光卫星遥感影像,经过科学手段对数据进行降噪、修正、分析统计,以年度、月度为更新频率,以省市县三级行政区划作为统计单元,制作高质量夜间灯光数据。

Sunny9qx的博客 3311

转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\\,\‘,\“,\?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;

转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\\,\',\",\?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;

南城花开过的博客 3万+

基于Java的qq截图工具

当今时代是飞速发展的信息时代,人们在对信息的处理中对图像的处理量与日俱增,这一点在文档人员上显得非常突出。本软件采用Java语言进行模拟qq截图功能获取屏幕方式灵活,可以获取指定的屏幕,并且可以对获取到的截图进行存储编辑添加文字等操作,对这些操作设置了自定义热键。该软件主要有捕获光标功能可以指定截取屏幕的区域。软件具有捕捉光标,可以随着鼠标的移动获取屏幕区域,为之后的存储和编辑提供前置条件。图片可以自命名获取到的截图可以依据当前系统时间进行命名,也可以通过模板文件名进行命名。

m0_53359226的博客 961

从零配置华为S5720交换机VLAN:Web界面与命令行双模式详解(附拓扑图)

本文详细解析华为S5720交换机VLAN配置的全过程,涵盖Web界面与命令行(CLI)双模式操作指南。从基础环境准备到多交换机环境配置同步,特别针对S5720-52X系列交换机的VLANif接口、端口分配策略及交换机堆叠技术进行深入讲解,并附实用拓扑图与配置示例,助力企业网络管理员高效完成VLAN部署。

happy2的博客 1371
上一篇: 利用VC++实现局域网实时视频传输
下一篇: VC++中进程与多进程管理的实现方法
dobymyself
博客等级 码龄19年 36粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值