winapi 截屏函数(转)

转载 2012年03月28日 20:05:40
void screen(wchar_t* fileName)
  {
   HWND window = ::GetDesktopWindow();
   HDC _dc = ::GetWindowDC(window);//屏幕DC
   HDC dc = CreateCompatibleDC(0);//内存DC
   
   RECT re;
   ::GetWindowRect(window, &re);
   int w = re.right,
   h = re.bottom;
   void* buf = new char[w*h*4];
   
   HBITMAP bm = CreateCompatibleBitmap(_dc, w, h);//建立和屏幕兼容的bitmap
   SelectObject(dc, bm);//将memBitmap选入内存DC 
   StretchBlt(dc, 0, 0, w, h, _dc, 0, 0, w, h, SRCCOPY);//复制屏幕图像到内存DC
   
   void* f =CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);
   
   GetObject(bm, 84, buf);
   
   tagBITMAPINFO bi;
   bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
   bi.bmiHeader.biWidth = w;
   bi.bmiHeader.biHeight = h;
   bi.bmiHeader.biPlanes = 1;
   bi.bmiHeader.biBitCount = 32;
   bi.bmiHeader.biCompression = 0;
   bi.bmiHeader.biSizeImage = 0;
   
   CreateDIBSection(dc, &bi, DIB_RGB_COLORS, &buf, 0, 0);
   GetDIBits(dc, bm, 0, h, buf, &bi, DIB_RGB_COLORS);
   
   BITMAPFILEHEADER bif;
   bif.bfType = MAKEWORD('B','M');
   bif.bfSize = w*h*4+54;
   bif.bfOffBits = 54;
  
   BITMAPINFOHEADER bii;
   bii.biSize = 40;
   bii.biWidth = w;
   bii.biHeight = h;
   bii.biPlanes = 1;
   bii.biBitCount = 32;
   bii.biCompression = 0;
   bii.biSizeImage = w*h*4;
   
   DWORD r;
   WriteFile(f, &bif, sizeof(bif), &r, NULL);
   WriteFile(f, &bii, sizeof(bii), &r, NULL);
   WriteFile(f, buf, w*h*4, &r, NULL);
  
   CloseHandle(f);
   DeleteDC(_dc);
   DeleteDC(dc);
  }

相关文章推荐

C#(WPF)中使用WinAPI函数进行截屏

在C#中,没有关于截屏的相关函数,这就需要使用Win32 API函数在C#代码中完成截屏。 一、基础知识介绍: gdi32.dll、user32.dll 二、编码实现...

用bitmap截屏函数,显示在pictureBox里面

这是用bitmap截屏函数。用到2个命名空间:using System.Drawing;                  using System.Drawing.Imaging; ...

写截屏软件的函数

原文来自:http://tmzhjw.bokee.com/viewdiary.14020399.html//*********************增加的函数********************...
  • helonSY
  • helonSY
  • 2011年04月13日 11:40
  • 446

C#调用非托管DLL函数bitblt实现截屏

C#调用非托管DLL函数bitblt实现截屏 由于工作需要,学习了GDI+编程的一些知识。其中看到了一个比较好的Demo,深入的了解后,却发现自己对如何用C#调用非托管DLL函数也有了更好的理解,于是...

在cocos2dx中的pushScene()中应用截屏函数

在cocos2dx中,pushScene创建一个场景,而场景的背景是黑色的,目前我还没有找到合适的方法使其透明,所以在网上找到一个方法替代,就是截屏 先上代码: //获取场景的尺寸 auto vi...

CALLBACK, WINAPI, AFXAPI和函数调用方式

原文:http://blog.163.com/patmusing/blog/static/13583496020103233446784/ (VC编译器下)   1. CALLBACK,WI...

CRT 中创建、删除线程函数与WinAPI的区别

_beginThreadex创建多线程解读 一、需要的头文件支持 #include // for _beginthread() 需要的设置:ProjectàSetting-->C/C++-...
  • shun01
  • shun01
  • 2013年11月14日 16:41
  • 559

WinAPI函数CreateProcess 关于创建无名管道通讯的不完美的实现

问题是什么? 由于工作原因,需要移植一个基于WINDOWS IOCP模型的程序到LINUX去.由于在LINUX是没有完成端口的东西,那么这一点上面LINUX提供了我们一个叫EPOLL的网络模型.解决...

VC++中的函数调用(CALLBACK WINAPI PASCAL 等)

#define   CALLBACK         __stdcall    #define   WINAPI             __stdcall    #define   WINAP...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:winapi 截屏函数(转)
举报原因:
原因补充:

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