当前位置: 代码迷 >> 综合 >> vc屏幕截图实现
  详细解决方案

vc屏幕截图实现

热度:61   发布时间:2024-02-22 13:32:32.0

1.获取保存截图文件的路径,暂时选定为桌面

  1. //把截图的文件保存到桌面

  2. BOOL CaptureLolToDesktop(HWND hWnd)

  3. {

  4. LPRECT lprc = new RECT;

  5. GetWindowRect(hWnd,lprc);

  6. DWORD llocaltime = GetTickCount();

  7. char chDesktopPath[MAX_PATH] = {0};

  8. SHGetSpecialFolderPathA(NULL,chDesktopPath,CSIDL_DESKTOP,0);//获取当前用户桌面路径

  9. char szSavePath[500];

  10. memset(szSavePath,0,500);

  11. sprintf(szSavePath,"%s\\截图%ld.jpg",chDesktopPath ,llocaltime);

  12. ScreenCapture(LPSTR(szSavePath),16,lprc);

  13. delete lprc;

  14. return TRUE;

  15. }


2.截图实现

  1. //屏幕截图功能实现

  2. HBITMAP ScreenCapture(LPSTR filename,WORD bitCount,LPRECT lpRect)

  3. {

  4. HBITMAP hBitmap;

  5. HDC hScreenDC=CreateDCA("DISPLAY",NULL,NULL,NULL); //通过指定DISPLAY来获取一个显示设备上下文环境

  6. HDC hmemDC=CreateCompatibleDC(hScreenDC); //该函数创建一个与指定设备兼容的内存设备上下文环境(DC)

  7. int ScreenWidth=GetDeviceCaps(hScreenDC,HORZRES); //获取指定设备的性能参数(此处获取屏幕宽度)

  8. int ScreenHeight=GetDeviceCaps(hScreenDC,VERTRES); //获取指定设备的性能参数(此处获取屏幕高度)

  9. HBITMAP hOldBM;

  10. PVOID lpData; //内存分配成功返回的指向所分配内存块的首地址指针

  11. int startX; //截图x位置

  12. int startY; //截图y位置

  13. int width; //截图宽度

  14. int height; //截图高度

  15. long BitmapSize;

  16. DWORD BitsOffset;

  17. DWORD ImageSize;

  18. DWORD FileSize;

  19. BITMAPINFOHEADER bmInfo; //BITMAPINFOHEADER结构所包含的成员表明了图像的尺寸、原始设备的颜色格式、以及数据压缩方案

  20. BITMAPFILEHEADER bmFileHeader;

  21. HANDLE bmFile,hpal,holdpal=NULL;;

  22. DWORD dwWritten;

  23. if(lpRect==NULL)

  24. {

  25. startX=startY=0;

  26. width=ScreenWidth;

  27. height=ScreenHeight;

  28. }

  29. else

  30. {

  31. startX=lpRect->left;

  32. startY=lpRect->top;

  33. width=lpRect->right-lpRect->left;

  34. height=lpRect->bottom-lpRect->top;

  35. }

  36. //创建一张长width,宽height的画布,用于后面绘制图形

  37. hBitmap=CreateCompatibleBitmap(hScreenDC,width,height);

  38. //该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

  39. hOldBM=(HBITMAP)SelectObject(hmemDC,hBitmap);

  40. //该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。

  41. BitBlt(hmemDC,0,0,width,height,hScreenDC,startX,startY,SRCCOPY);

  42. hBitmap=(HBITMAP)SelectObject(hmemDC,hOldBM);

  43. if(filename==NULL)

  44. {

  45. DeleteDC(hScreenDC);

  46. DeleteDC(hmemDC);

  47. return hBitmap;

  48. }

  49. BitmapSize=((((width*32)+32)/32)*4)*height;

  50. //用来在指定的堆上分配内存,并且分配后的内存不可移动(HEAP_NO_SERIALIZE 不使用连续存取)

  51. lpData=HeapAlloc(GetProcessHeap(),HEAP_NO_SERIALIZE,BitmapSize);

  52. ZeroMemory(lpData,BitmapSize);

  53. ZeroMemory(&bmInfo,sizeof(BITMAPINFOHEADER));

  54. bmInfo.biSize=sizeof(BITMAPINFOHEADER); //位图信息结构长度 ,必须为40

  55. bmInfo.biWidth=width; //图像宽度 单位是像素

  56. bmInfo.biHeight=height; //图像高度 单位是像素

  57. bmInfo.biPlanes=1; //必须为1

  58. bmInfo.biBitCount=bitCount; //设置图像的位数。比如8位,16位,32位位数越高分辨率越高

  59. bmInfo.biCompression=BI_RGB; //位图是否压缩 BI_RGB为不压缩

  60. ZeroMemory(&bmFileHeader,sizeof(BITMAPFILEHEADER));

  61. BitsOffset=sizeof(BITMAPFILEHEADER)+bmInfo.biSize;

  62. ImageSize=((((bmInfo.biWidth*bmInfo.biBitCount)+31)/32)*4)*bmInfo.biHeight;

  63. FileSize=BitsOffset+ImageSize;

  64. bmFileHeader.bfType=0x4d42;//'B'+('M'<<8);

  65. bmFileHeader.bfSize=FileSize;

  66. bmFileHeader.bfOffBits=BitsOffset;

  67. hpal = GetStockObject(DEFAULT_PALETTE);

  68. if (hpal)

  69. {

  70. holdpal = SelectPalette(hmemDC, (HPALETTE)hpal, false);

  71. RealizePalette(hmemDC);

  72. }

  73. GetDIBits(hmemDC,hBitmap,0,bmInfo.biHeight,lpData,(BITMAPINFO *)&bmInfo,DIB_RGB_COLORS);

  74. if (holdpal)

  75. {

  76. SelectPalette(hmemDC, (HPALETTE)holdpal, true);

  77. RealizePalette(hmemDC);

  78. }

  79. bmFile=CreateFileA(filename,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

  80. if(bmFile==INVALID_HANDLE_VALUE)

  81. {

  82. MessageBoxA(NULL,"Create File Error!","提示",MB_OK | MB_ICONWARNING);

  83. }

  84. WriteFile(bmFile,&bmFileHeader,sizeof(BITMAPFILEHEADER),&dwWritten,NULL);

  85. WriteFile(bmFile,&bmInfo,sizeof(BITMAPINFOHEADER),&dwWritten,NULL);

  86. WriteFile(bmFile,lpData,ImageSize,&dwWritten,NULL);

  87. CloseHandle(bmFile);

  88. HeapFree(GetProcessHeap(),HEAP_NO_SERIALIZE,lpData);

  89. ::ReleaseDC(0,hScreenDC);

  90. DeleteDC(hmemDC);

  91. //MessageBoxA(NULL,"玩家您好,你的本场游戏战绩已经通过截图保存在桌面","提示",MB_OK);

  92. return hBitmap;

  93. }

  相关解决方案