松鼠的博客

导航

统计

GDI截屏

思路:
(1)获取屏幕绘图设备
(2)创建一个与屏幕绘图设备相兼容的内存绘图设备
(2)在内存中创建一个与屏幕绘图设备相兼容的图像对象
(3)将屏幕设备中的图像复制到内存绘图设备中
(4)将内存图像保存到文件中

相关函数:
GetDIBits:按位的方式返回指定的BITMAP,并按指定的格式存储到内存中

代码:

复制代码
int GetBitmapFromScreen(char *lpFileName)
{
    
char *lpBuf;
    HBITMAP hBitmap;
    HBITMAP hOld ;
    HDC hDC;
    HDC hcDC;
    BITMAP bb;
    BITMAPINFO b;
    HANDLE hp;
    HANDLE fh 
= NULL;
    DWORD dwX;
    DWORD dwY;
    
    dwX 
= GetSystemMetrics(SM_CXSCREEN);
    dwY 
= GetSystemMetrics(SM_CYSCREEN);
    hDC 
= GetDC(NULL);
    hcDC    
= CreateCompatibleDC(hDC);
    hBitmap 
= CreateCompatibleBitmap(hDC,dwX,dwY);
    hOld    
= (HBITMAP)SelectObject(hcDC,hBitmap);
    BitBlt(hcDC,
00,dwX,dwY, hDC, 00, SRCCOPY); 
    bb.bmWidth        
= dwX;
    bb.bmHeight        
= dwY;
    bb.bmPlanes        
= 1;
    bb.bmWidthBytes    
= bb.bmWidth*3;
    bb.bmBitsPixel    
= 3;
    bb.bmType        
= 0;
    b.bmiHeader.biSize        
= sizeof(BITMAPINFOHEADER);
    b.bmiHeader.biWidth        
= dwX;
    b.bmiHeader.biHeight    
= dwY;
    b.bmiHeader.biPlanes    
= 1;
    b.bmiHeader.biBitCount    
= 3*8;
    b.bmiHeader.biCompression    
= BI_RGB;
    b.bmiHeader.biSizeImage        
= 0;
    b.bmiHeader.biXPelsPerMeter    
= 0;
    b.bmiHeader.biYPelsPerMeter    
= 0;
    b.bmiHeader.biClrUsed        
= 0;
    b.bmiHeader.biClrImportant    
= 0;
    b.bmiColors[
0].rgbBlue        = 8;
    b.bmiColors[
0].rgbGreen        = 8;
    b.bmiColors[
0].rgbRed        = 8;
    b.bmiColors[
0].rgbReserved    = 0;
    hp        
= GetProcessHeap();
    lpBuf    
= (char *)HeapAlloc(hp,HEAP_ZERO_MEMORY,bb.bmHeight*bb.bmWidth*4);

    GetDIBits(hcDC,hBitmap,
0,dwY,lpBuf,&b,DIB_RGB_COLORS);
    SaveBitmapToFile(
&bb,lpFileName,lpBuf);
    ReleaseDC(NULL,hDC);
    DeleteDC(hcDC); 
    DeleteObject(hBitmap);
    DeleteObject(hOld);
    HeapFree(hp,
0,lpBuf);
    
return true;
}
复制代码


相关参考:
GetDIBits
http://www.cnblogs.com/piccolo/articles/241933.html

posted on   Xproer-松鼠  阅读(799)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示