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);
  }

利用win api 实现截屏 保存为BMP并转为字节流

c++ 利用winAPI 实现截屏幕; 代码: #include void ScreenSnap(HBITMAP hBitmap,char *bmpPath,HDC dc); int main()...
  • cxlmax
  • cxlmax
  • 2012年02月12日 19:02
  • 3642

windows 截屏api

/*---------------------------------------- BRICKS1.C -- LoadBitmap Demonstration (c) Charles Petzold...
  • zicheng_lin
  • zicheng_lin
  • 2011年11月24日 17:29
  • 9900

windows核心编程---UNICODE和ANSI间的相互转换

UNICODE和ANSI间的相互转换 ,主要通过以下两个函数进行转换:MultiByteToWideChar和WideCharToMultiByte。 MultiByteToWideChar...
  • wangqiulin123456
  • wangqiulin123456
  • 2012年11月18日 20:18
  • 2155

在函数前面加上WINAPI、CALLBACK

一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思 又不是返回值 为什么加在前面 今天终于知道了这是一个呼叫声明(姑且称之吧)。 引子: 看看这个函数: int PASCA...
  • qq_28098067
  • qq_28098067
  • 2016年01月26日 19:59
  • 1720

C语言中的一些winapi函数!

这篇文章,我将从最基本的开始谈起。但希望可以涉及更广的层面,而不仅仅是为你的程序除错(debug)。你将会看到,我认为除错(debugging)这个字的全部意义,并不只是通过ide的内建机制来运行的。...
  • u012402926
  • u012402926
  • 2015年10月23日 10:22
  • 478

黑客常用WinAPI函数整理

黑客常用WinAPI函数整理   之前的博客写了很多关于Windows编程的内容,在Windows环境下的黑客必须熟练掌握底层API编程。为了使读者对黑客常用的Windows API有个更全面...
  • Chinamming
  • Chinamming
  • 2014年02月08日 21:25
  • 925

在用C++写函数时,在函数定义中的WINAPI代表什么含义?

在用C++写函数时,在函数定义中的WINAPI代表什么含义?例如:BOOL WINAPI IsNumeric(char *chString)与BOOL IsNumeric(char *chString...
  • cjjwwss
  • cjjwwss
  • 2013年11月15日 10:29
  • 5342

在函数前面加上WINAPI、CALLBACK等是什么意思

一直搞不懂为什么在函数前面加上WINAPI、CALLBACK等是什么意思又不是返回值为什么加在前面今天终于知道了这是一个呼叫声明(姑且称之吧) 在VC++ 6.0中,WINDEF.h  ...
  • cjjwwss
  • cjjwwss
  • 2013年11月15日 10:36
  • 1724

c++利用winapi实现简单多线程

#include #include #include using namespace std; DWORD WINAPI FUN1Proc(LPVOID lpParameter); //线程函数入...
  • u011575841
  • u011575841
  • 2016年11月10日 15:33
  • 1689

DWORD WINAPI

DWORD WINAPI Zhaa(LPVOID PP) 查看WINAPI的定义,它是这样定义的 #define WINAPI _stdcall 可以发现CALLBACK也是这样定义的 _s...
  • chenzhen1213
  • chenzhen1213
  • 2014年11月27日 14:23
  • 3338
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:winapi 截屏函数(转)
举报原因:
原因补充:

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