美文网首页
(C语言)屏幕截取程序

(C语言)屏幕截取程序

作者: 牛i蛋 | 来源:发表于2019-04-04 20:01 被阅读0次

背景

今天和大家分享一下C语言实现屏幕截取程序,也算是一个练手的小程序,这个代码直接编译就可以啦,已经调试完毕了。

解决方案

首先利用argv设置截屏后的图片的保存路径 运行程序,路径上会生成一个bmp图片文件
那么屏幕就截取下来了,下面直接分享源码:

源码

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

HANDLE      DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage) ;
BOOL        CapScreen(LPTSTR FileName);

HANDLE DDBtoDIB( HBITMAP bitmap, DWORD dwCompression, HPALETTE  hPal,DWORD * sizeimage) 
{
    BITMAP              bm;
    BITMAPINFOHEADER    bi;
    LPBITMAPINFOHEADER  lpbi;
    DWORD               dwLen;
    HANDLE              hDib;
    HANDLE              handle;
    HDC                 hdc;

    if( dwCompression == BI_BITFIELDS )
        return NULL;

    if (hPal==NULL)
        hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );

    GetObject(bitmap,sizeof(bm),(LPSTR)&bm);

    bi.biSize        = sizeof(BITMAPINFOHEADER);
    bi.biWidth        = bm.bmWidth;
    bi.biHeight         = bm.bmHeight;
    bi.biPlanes         = 1;
    bi.biBitCount        = bm.bmPlanes * bm.bmBitsPixel;
    bi.biCompression    = dwCompression;
    bi.biSizeImage        = 0;
    bi.biXPelsPerMeter    = 0;
    bi.biYPelsPerMeter    = 0;
    bi.biClrUsed        = 0;
    bi.biClrImportant    = 0;

    int ncolors = (1 << bi.biBitCount); if( ncolors> 256 ) 
        ncolors = 0;
    dwLen  = bi.biSize + ncolors * sizeof(RGBQUAD);

    hdc = GetDC(NULL);
    hPal = SelectPalette(hdc,hPal,FALSE);
    RealizePalette(hdc);

    hDib = GlobalAlloc(GMEM_FIXED,dwLen);

    if (!hDib){
        SelectPalette(hdc,hPal,FALSE);
        ReleaseDC(NULL,hdc);
        return NULL;
    }

    lpbi = (LPBITMAPINFOHEADER)hDib;
    *lpbi = bi;

    GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,
        (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS );

    bi = *lpbi;

    if (bi.biSizeImage == 0){
        bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) 
            * bi.biHeight;
        if (dwCompression != BI_RGB)
            bi.biSizeImage = (bi.biSizeImage * 3) / 2;
    }


    dwLen += bi.biSizeImage;
    if (handle = GlobalReAlloc(hDib, dwLen, GMEM_MOVEABLE))
        hDib = handle;
    else{
        GlobalFree(hDib);


        SelectPalette(hdc,hPal,FALSE);
        ReleaseDC(NULL,hdc);
        return NULL;
    }

    lpbi = (LPBITMAPINFOHEADER)hDib;

    BOOL bgotbits = GetDIBits( hdc, bitmap,
        0L,                     
        (DWORD)bi.biHeight,      
        (LPBYTE)lpbi            
        + (bi.biSize + ncolors * sizeof(RGBQUAD)),
        (LPBITMAPINFO)lpbi,     
        (DWORD)DIB_RGB_COLORS);  

    if( !bgotbits )
    {
        GlobalFree(hDib);

        SelectPalette(hdc,hPal,FALSE);
        ReleaseDC(NULL,hdc);
        return NULL;
    }

    SelectPalette(hdc,hPal,FALSE);
    ReleaseDC(NULL,hdc);
    *sizeimage=bi.biSizeImage;
    return hDib;
} 

BOOL CapScreen(LPTSTR FileName)
{
    DWORD sizeimage;
    HDC hdc = CreateDC("DISPLAY", NULL, NULL, NULL); 
    HDC CompatibleHDC = CreateCompatibleDC(hdc); 
    HBITMAP BmpScreen = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES)); 
    SelectObject(CompatibleHDC, BmpScreen);
    BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY);

    HANDLE  pbitmapwithoutfileh=DDBtoDIB(BmpScreen, BI_RGB,0,&sizeimage);
    BITMAPFILEHEADER bfh;

    bfh.bfType = ((WORD)('M'<< 8)|'B');
    bfh.bfReserved1 = 0;
    bfh.bfReserved2 = 0;
    bfh.bfSize = 54+sizeimage;
    bfh.bfOffBits = 54;

    HANDLE  hFile=CreateFile(FileName,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    DWORD dwWrite;

    WriteFile(hFile,&bfh,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);

    WriteFile(hFile,pbitmapwithoutfileh,bfh.bfSize,&dwWrite,NULL);  
    DeleteDC(hdc);

    CloseHandle(CompatibleHDC);
    return true;
}

int main(int argc,char * argv[])
{
    BOOL  result;
    result = CapScreen(argv[1]);
    if(result == TRUE)
    {
        printf("Success!\n");
    }
    else
    {
        printf("Failed!\n");
    }
    return 0;
}

相关文章

  • (C语言)屏幕截取程序

    背景 今天和大家分享一下C语言实现屏幕截取程序,也算是一个练手的小程序,这个代码直接编译就可以啦,已经调试完毕了。...

  • 编程字典-C语言基础教程源码

    C源码示例C源码示例C语言文件扩展名第一个C程序C语言度量单位转换C语言函数 调试C程序C语言语义错误C实例程序C...

  • C语言的内存布局

    C语言编程程序的内存如何布局 C语言程序连接过程中的特性和常见错误 C语言程序的运行方式 一:C语言程序的存储区域...

  • 学习计算机之路(C语言篇2)第一个程序

    第一个程序c语言程序 我们先来看一个简单的c程序 先来看一下这个简单的程序,该程序是在屏幕上打印一些内容 运行内容...

  • 计算机二级考试

    C语言程序设计、VB语言程序设计、Java语言程序设计、Access数据库程序设计、C++语言程序设计、MySQL...

  • C语言基础及指针⑥字符操作

    接续上篇C语言基础及指针⑤动态内存分配 字符操作 , 是我们写程序时 , 最常用的一种操作 , 例如:字符串截取 ...

  • 【持续更新】C语言 第一天学习笔记(作业)

    十七【理解】用C语言打印图形 思考&实现1: 1.编写第一个C语言程序,用至少2种方式在屏幕上输出以下内容(注意换行):

  • 无标题文章

    今天讲了c语言程序格式,基本数据类型,c语言程序结构。 c语言程序格式一般为 #include int main(...

  • 关于在Linux系统下编辑C语言程序

    本周我们学习了在Linux系统下编辑C语言程序。在编写C语言程序的初始步骤与编辑脚本程序相类似,只不过C语言程序时...

  • C++代码训练营 | 经典绘图工具EasyX

    EasyX简介 在学习C语言时,很多同学抱怨说C只能写最简单的Demo程序,通过printf在屏幕上打印字符来验证...

网友评论

      本文标题:(C语言)屏幕截取程序

      本文链接:https://www.haomeiwen.com/subject/abnqiqtx.html