行为矫正有哪些方法:VC 怎样实现屏幕捕捉(源程序)

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 03:57:14

VC++怎样实现屏幕捕捉(源程序)

jackyhwei 发布于 2011-11-06 14:10 点击:155次 这个就是QQ里截取屏幕的功能实现代码,很简单,完整代码如下。 TAG: 视频采集  屏幕捕捉  

这个就是QQ里截取屏幕的功能实现代码,很简单,完整代码如下。

在ScreenCaptureDlg.cpp中声明2个全局变量:

  1. HWND hwndCapture; 
  2. CRect rectCapture; 

相关代码:

  1. void CScreenCaptureDlg::onMouseMove(UINT nFlags, CPoint point) 
  2. //如果用户将鼠标左键按住不放,则开始抓取图片 
  3. if(nFlags==MK_LBUTTON) 
  4. //隐藏程序窗口,以免影响在抓取时的“视野” 
  5. ShowWindow(SW_HIDE); 
  6. //装入“照相机”鼠标,开始追踪鼠标的移动 
  7. HCURSOR cur=LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_CAMERA)); 
  8. SetCursor(cur); 
  9. SetCapture(); 
  10. //获得鼠标所在处的窗口句柄 
  11. ClientToScreen(&point); 
  12. hwndCapture=(HWND)::WindowFromPoint(point); 
  13. //取得屏幕的设备环境句柄,以便在屏幕的任何位置绘图 
  14. HDC hDC=::GetDC(NULL); 
  15. //建立一红色的画笔 
  16. HPEN hPen =CreatePen(PS_INSIDEFRAME,6, RGB(255,0,0)); 
  17. //将绘图模式设为R2_NOTXORPEN,在绘图时可以不破坏原有的背景 
  18. int nMode =SetROP2(hDC, R2_NOTXORPEN); 
  19. HPEN hpenOld= (HPEN)SelectObject(hDC, hPen); 
  20. //得到鼠标所在处的窗口的区域 
  21. ::GetWindowRect(hwndCapture,&rectCapture); 
  22. //在鼠标所在处的窗口四周画一红色的矩形,做为选定时的提醒 
  23. POINT pt[5]; 
  24. pt[0] = CPoint(rectCapture.left, rectCapture.top); 
  25. pt[1] = CPoint(rectCapture.right,rectCapture.top); 
  26. pt[2] = CPoint(rectCapture.right,rectCapture.bottom); 
  27. pt[3] = CPoint(rectCapture.left, rectCapture.bottom); 
  28. pt[4] = CPoint(rectCapture.left, rectCapture.top); 
  29.  
  30. ::Polyline(hDC,pt,5);   
  31. //延时后再重绘红色的矩形,这样就不会破坏原有内容 
  32. Sleep(100); 
  33. ::Polyline(hDC,pt,5); 
  34. ::SelectObject(hDC,hpenOld); 
  35. ::ReleaseDC(NULL,hDC); 
  36.  
  37. }
  38.  
  39. CDialog::onMouseMove(nFlags, point); 
  40.  
  41. void CScreenCaptureDlg::OnLButtonUp(UINT nFlags, CPoint point) 
  42. //得到鼠标所在处的窗口的区域宽、高   
  43. int nWidth=rectCapture.Width(); 
  44. int nHeight=rectCapture.Height(); 
  45. HDC hdcScreen, hMemDC;   
  46. HBITMAP hBitmap, hOldBitmap;   
  47. //建立一个屏幕设备环境句柄 
  48. hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); 
  49. hMemDC = CreateCompatibleDC(hdcScreen); 
  50. //建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图 
  51. hBitmap = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight); 
  52. // 把新位图选到内存设备描述表中 
  53. hOldBitmap =(HBITMAP)SelectObject(hMemDC, hBitmap); 
  54. // 把屏幕设备描述表拷贝到内存设备描述表中 
  55. BitBlt(hMemDC, 0, 0, nWidth, nHeight, hdcScreen,rectCapture.left
  56. ,rectCapture.top,SRCCOPY); 
  57. //取回鼠标所在处的窗口屏幕位图的句柄 
  58. hBitmap =(HBITMAP)SelectObject(hMemDC, hOldBitmap); 
  59. DeleteDC(hdcScreen); 
  60. DeleteDC(hMemDC); 
  61.  
  62. // 返回位图句柄 
  63. //打开剪贴板,并将位图拷到剪贴板上 
  64. OpenClipboard() ; 
  65. EmptyClipboard(); 
  66. SetClipboardData(CF_BITMAP, hBitmap); 
  67. //关闭剪贴板 
  68. CloseClipboard(); 
  69.  
  70. MessageBox("屏幕内容已经拷到剪贴板上!"); 
  71. //终止鼠标捕获 
  72. ReleaseCapture(); 
  73. //恢复窗口显示模式 
  74. ShowWindow(SW_NORMAL);