vc++的屏幕截图

原创 2017年01月02日 23:29:42

截图功能想起来真的不难,可是,我实际操作的时候,却发现真的不容易,网上讲了很多方法,但是,要么实现起来很复杂,要么就是库类在vc++不支持(其实网上资料很多,可能是我没学会)。花了好长时间,终于用gdi+搞定了。

vc本身不带有gdi+库,需要自己下载,我上传了一份。地址:
http://download.csdn.net/download/lsjweiyi/9727096

vc中还需要进行配置,具体配置方法百度吧。

#define ULONG_PTR ULONG
#include  <iostream>   
#include  <windows.h>
#include  <Gdiplus.h>
using   namespace   Gdiplus;
using   namespace   std   ;

//获取Encoder的CLSID的方法
int GetEncoderClsid(const WCHAR* format, CLSID* pCLSID)
{
 UINT num = 0;
 UINT size = 0;
 ImageCodecInfo* pImageCodecInfo = NULL;//把指针变为0

 GetImageEncodersSize(&num, &size);//获取图片编码器大小

 if(size == 0){
    return -1;
    }
 pImageCodecInfo = (ImageCodecInfo *)(malloc(size));
 if(pImageCodecInfo == NULL){
    return -1;
    }
 GetImageEncoders(num, size, pImageCodecInfo);

 // Find for the support of format for image in the windows
 for(UINT i = 0; i < num; ++i)
 {
  //MimeType: Depiction for the program image 
  if( wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
  { 
   *pCLSID = pImageCodecInfo[i].Clsid;
   free(pImageCodecInfo);
   return i; 
  } 
 } 
 free(pImageCodecInfo); 
 return -1;

}

HRESULT GetScreenSnap()
{
  ///////////////////////////////////////////
  LPCWSTR     pszFileName = L"test.bmp";
  /*
  int     xs = 200;
  int     ys = 200;
  int     quality = 80;
  */
  int     quality = 80;

  //得到屏幕设备HDC以及长宽      
  HDC hdc = GetWindowDC(NULL);
  int x  = GetDeviceCaps(hdc,     HORZRES);      
  int y  = GetDeviceCaps(hdc,     VERTRES);

  //创建与屏幕设备兼容的内存区域HDC
  HDC hmemdc = ::CreateCompatibleDC(hdc);

  //创建相关位图,把位图与内存区域HDC绑定
  HBITMAP hbmp = ::CreateCompatibleBitmap(hdc,x,y),hold;      
  hold  = (HBITMAP)::SelectObject(hmemdc,hbmp);

  //把屏幕设备传到内存区域(位图)中
  BitBlt(hmemdc, 0, 0, x, y,hdc,0,0,SRCCOPY); 


   //添加鼠标到图片里
   //POINT l_pt;
   //::GetCursorPos(&l_pt);
   //HCURSOR l_hCursor = ::GetCursor();
   //::DrawIcon(hmemdc,l_pt.x,l_pt.y,l_hCursor); 

  //还原内存区域
  SelectObject(hmemdc,hold);
 /*
  //::ShowWindow(NULL,SW_SHOWMAXIMIZED);//SW_SHOWMAXIMIZED
  //得到显示对话框的HDC
  HDC hdc1 = GetDC(NULL);
  //创建与对话框兼容的内存区域的DC
  HDC hmemdc1 = ::CreateCompatibleDC(hdc1); 
  //把位图与对话框兼容内存绑定
  hold  = (HBITMAP)::SelectObject(hmemdc1,hbmp);
  //把对话框兼容内存的内容(位图)传至对话框
  BitBlt(hdc1, 0, 0, x, y,hmemdc1,0,0,SRCCOPY);

  //还原内存区域
  SelectObject(hmemdc1,hold);
  */

  ::UpdateWindow(NULL);
  {      

  //使用GDI+保存位图
    Bitmap bit(hbmp,NULL);
    printf ("%d",sizeof(bit));
    printf ("\n");
    CLSID encoderClsid;
    //encoderClsid = (void*)(new char[10]);
    EncoderParameters encoderParameters;      

    encoderParameters.Count = 1;      
    encoderParameters.Parameter[0].Guid = EncoderQuality;      
    encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;      
    encoderParameters.Parameter[0].NumberOfValues = 1;      
    encoderParameters.Parameter[0].Value = &quality;      

    GetEncoderClsid(L"image/bmp",&encoderClsid);
    bit.Save(pszFileName,&encoderClsid,&encoderParameters);
   }      
   ::DeleteObject(hbmp);      
   ::DeleteObject(hmemdc);
   //::DeleteObject(hmemdc1);
   //::DeleteObject(hdc1);
   ::DeleteObject(hdc);
   return 0;   
} 

int main(){
    //初始化gdi+
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    GetScreenSnap();

    GdiplusShutdown(gdiplusToken); //关闭gdi+
    return 0;
}

放张效果图:
这里写图片描述

其实我还没完全弄懂整个代码,只知道是获取屏幕句柄,然后用位图保存。比如如何不保存直接把位图显示出来,不知道可不可以做到。

版权声明:本文为博主原创文章,未经博主允许不得转载。

vc屏幕截图实现

1.获取保存截图文件的路径,暂时选定为桌面 //把截图的文件保存到桌面 virtual BOOL CaptureLolToDesktop(HWND hWnd) { Sleep(1*1000); ...
  • qingzai_
  • qingzai_
  • 2015年08月06日 17:05
  • 2398

Android 获取屏幕截图

获取屏幕截图,就个人理解屏幕截图的过程如下:首先检索顶层窗口的装饰视图,然后启用绘图缓存,创建绘图缓存,获得绘图缓存,拿到屏幕的宽高,根据这些条件创建一个bitmap,释放绘图缓存的资源。 对于不包...
  • newbie_zhu
  • newbie_zhu
  • 2016年02月15日 14:09
  • 646

屏幕截图实现

实现屏幕截图的功能,支持窗口的自动套索、区域放大、矩形椭圆等的绘制、文字输入等...
  • workthinking
  • workthinking
  • 2016年05月21日 20:09
  • 977

iOS 快速获取屏幕截图的方法

如下说明了2种方法获取屏幕截图第一种、通过UIView的方法,方法如下@interface UIView (UISnapshotting)- (UIView *)snapshotViewAfterSc...
  • u012198553
  • u012198553
  • 2016年03月30日 16:05
  • 1308

Android屏幕截图方式总结

0、Android屏幕截图方式: 借助PC端工具截图Android手机端截图 1、借助PC端工具截图 PC端截图可用的工具非常之多,从Android SDK提供的...
  • ToBeTheEnder
  • ToBeTheEnder
  • 2016年12月20日 14:43
  • 1263

VC屏幕截图并保存为bmp、jpg、png等格式文件

int main(){HDC hdcSrc = GetDC(NULL);int nBitPerPixel = GetDeviceCaps(hdcSrc, BITSPIXEL);int nWidth =...
  • chinafe
  • chinafe
  • 2013年11月25日 10:41
  • 4273

带鼠标的屏幕截图

// 屏幕截图程序,可运行PC,WinCE,Windows Mobile平台上     void SaveScreenToFile(LPCTSTR szFileName)  {      HDC hS...
  • worldy
  • worldy
  • 2013年11月30日 13:05
  • 756

iOS 截图 截取屏幕

// 从view上截图- (UIImage *)getImage { UIGraphicsBeginImageContextWithOptions(CGSizeMake(150, 150), NO, ...
  • yangtb2010
  • yangtb2010
  • 2014年08月26日 17:54
  • 9828

VC++截取屏幕(截图)并存为bmp图片

主要代码是:  ShowWindow(SW_HIDE);   HDC myDC=::GetDC(0);   int x=GetSystemMetrics(SM_CXSCREEN);   int...
  • bojie5744
  • bojie5744
  • 2014年06月02日 01:38
  • 1929

获得屏幕截图代码:不包括状态栏

private static Bitmap takeScreenShot(Activity activity) { View view = activity.getWindow().g...
  • u013708985
  • u013708985
  • 2015年12月06日 11:17
  • 306
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc++的屏幕截图
举报原因:
原因补充:

(最多只允许输入30个字)