C++ 在Windows下截取整个屏幕 和 指定句柄窗口的屏幕

#include <windows.h>
#include <stdint.h>
#include <stdio.h>

void ShootScreen(const char* filename, HWND hWnd)
{
    HDC hdc = CreateDC("DISPLAY", NULL, NULL, NULL);
    int32_t ScrWidth = 0, ScrHeight = 0;
    RECT rect = { 0 };
    if (hWnd == NULL)
    {
        ScrWidth = GetDeviceCaps(hdc, HORZRES);
        ScrHeight = GetDeviceCaps(hdc, VERTRES);
    }
    else
    {
        GetWindowRect(hWnd, &rect);
        ScrWidth = rect.right - rect.left;
        ScrHeight = rect.bottom - rect.top;
    }
    HDC hmdc = CreateCompatibleDC(hdc);

    HBITMAP hBmpScreen = CreateCompatibleBitmap(hdc, ScrWidth, ScrHeight);
    HBITMAP holdbmp = (HBITMAP)SelectObject(hmdc, hBmpScreen);

    BITMAP bm;
    GetObject(hBmpScreen, sizeof(bm), &bm);

    BITMAPINFOHEADER bi = { 0 };
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = bm.bmWidth;
    bi.biHeight = bm.bmHeight;
    bi.biPlanes = bm.bmPlanes;
    bi.biBitCount = bm.bmBitsPixel;
    bi.biCompression = BI_RGB;
    bi.biSizeImage = bm.bmHeight * bm.bmWidthBytes;  // 图片的像素数据
    char *buf = new char[bi.biSizeImage];
    BitBlt(hmdc, 0, 0, ScrWidth, ScrHeight, hdc, rect.left, rect.top, SRCCOPY);
    GetDIBits(hmdc, hBmpScreen, 0L, (DWORD)ScrHeight, buf, (LPBITMAPINFO)&bi, (DWORD)DIB_RGB_COLORS);

    BITMAPFILEHEADER bfh = { 0 };
    bfh.bfType = ((WORD)(‘M‘ << 8) | ‘B‘);
    bfh.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bi.biSizeImage;
    bfh.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
    HANDLE hFile = CreateFile(filename, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    DWORD dwWrite;
    WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwWrite, NULL);
    WriteFile(hFile, &bi, sizeof(BITMAPINFOHEADER), &dwWrite, NULL);
    WriteFile(hFile, buf, bi.biSizeImage, &dwWrite, NULL);
    CloseHandle(hFile);
    hBmpScreen = (HBITMAP)SelectObject(hmdc, holdbmp);
}

int32_t main()
{
    char name[256] = {0};
    for (int32_t i = 0; i < 20; ++i)
    {
        sprintf_s(name, 256, "%d.bmp", i);
        printf("shooting %s\n", name);
        ShootScreen(name, NULL);
        Sleep(1000);
    }
    return 0;
}

时间: 2024-10-06 19:52:19

C++ 在Windows下截取整个屏幕 和 指定句柄窗口的屏幕的相关文章

定时任务:windows下备份数据文件到指定的目录

#windows下备份数据文件到指定的目录 (1)新建文本文件 echo off echo ------------------ 开始备份日志文件------------------ set ymd=%date:~0,4%%date:~5,2%%date:~8,2% set backup-dir=C:\RTXdbbackup\rtxdb-%ymd% echo 备份目录:%backup-dir%echo -----------------------------------------------

windows下修改tomcat启动时指定的jdk

我本机默认的jdk版本是1.7,装有tomcat7和tomcat8两个版本的tomcat.现在是想用tomcat8使用jdk1.8来运行 1.查看tomcat启动时使用的jdk版本 cmd->%TOMCAT_HOME%/bin下执行version 此时我的tomcat使用的jdk1.8的版本,这个时候我将它修改成为jdk1.7的版本. 2.编辑 %TOMCAT_HOME%/bin/setclasspath.bat文件(linux下编辑setclasspath.sh文件) 上面修改成为对应jdk的

Windows下使用ffmpeg与java实现截取视频缩略图

[ffmpeg.exe可执行文件获取]: 网上搜索后得到编译好的ffmpeg文件,下载地址:http://download.csdn.net/source/453719 [安装]: 将下载的文件解压,如:D:\ffmpeg,一共三个文件,分别是:ffmpeg.exe.ffplay.exe.pthreadGC2.dll.我们用到的应该是ffmpeg.exe. [实现获取视频缩略图的两种方式]: 1.调用批处理文件: 批处理文件(如:ffmpeg.bat),内容:D:/ffmpeg/ffmpeg.e

windows下回车与换行符

windows下回车与换行符 从键盘输入的数据一般是ASCII码,也就是文本文件,在送到计算机内存时,回车和换行符转换成一个换行符(也就是说回车和换行符在windows文本中是两个字符),再从内存中以“wb”方式(二进制方式)输出到文件中,此时不发生字符转换,按内存中存储形式原样输出到磁盘文件中,当用“rb”方式(二进制方式)读入数据时,数据按原样输入,也不发生字符转换,直接读入到内存中,当用printf函数在屏幕上显示字符时,换行符又转换为回车加上换行符. 若以"r"方式(文本方式)

SecureCRT是最常用的终端仿真程序,简单的说就是Windows下登录UNIX或Liunx服务器主机的软件,本文主要介绍SecureCRT的使用方法和技巧

VanDyke CRT 和 VanDyke SecureCRT是最常用的终端仿真程序,简单的说就是Windows下登录UNIX或Liunx服务器主机的软件.二者不同的是SecureCRT支持SSH(SSH1和SSH2). 1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 use 5.01; 6 7 8 9 sub license { 10 print "\n". 11 "License:\n\n". 12 &qu

windows下VMware安装Ubuntu的文件共享(VM-tools)

因为工作的需要,最近用到了Vm-ware虚拟机,我用的是win7+vmware+ubuntu的配置,相信很多人都用过类似的环境,下面我就说说文件共享的问题,虽然网上有很多教程,但是感觉都不全面,至少我也是找了好几个拼凑起来才搞定这个问题. 首先,需要安装VM-tools,这个比较简单,直接借用别人的方法贴出来: 1.安装工具.让虚拟机运行于窗口状态,不要全屏,按Ctrl+Alt让鼠标释放出来.在VMware的菜单栏上选择"虚拟机/安装虚拟机工具(VM/Install VMware Tools..

Win 管理器 运行命令 大全(Windows下的DOS运行命令)

DOS 运行命令管理器字符大全 Win 管理器  运行命令 大全(Windows下的DOS运行命令) Nslookup-------IP 地址侦测器 explorer-------打开资源管理器 devmgmt.msc--- 设备管理器 progman--------程序管理器 taskmgr-----任务管理器(2000/ xp/ 2003 ) ntmsmgr.msc----移动存储管理器 eventvwr-------事件查看器 sysedit--------系统配置编辑器 regedt32

Windows下 VM12虚拟机安装OS X 10.11 和VM TOOLS

Windows下虚拟机安装Mac OS X —– VMware Workstation12安装Mac OS X 10.11 本文即将介绍WIN虚拟MAC的教程.完整详细教程(包含安装中的一些问题) [并且适用其他mac os x版本] Windows下 VM12虚拟机安装OS X 10.11(详细教程) (图挂了的话,请点击此处.本人在百度发的) 工具/原料 Mac OS X 10.11 镜像文件(链接:http://pan.baidu.com/s/1pL8HE59 密码:cq4d) unloc

Windows下常用的100个CMD指令以及常见的操作

Windows下常用的100个CMD指令以及常见的操作 常用的100个CMD指令 gpedit.msc-–组策略 2. sndrec32---录音机 3. Nslookup---IP地址侦测器 ,是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具. 它在 Windows NT/2000/XP 中均可使用 , 但在 Windows 98 中却没有集成这一个工具. 4. explorer---打开资源管理器 5. logoff---注销命令 6. shutdown---60秒倒计时