首页 > 编程语言 >c++ gdiplus实现屏幕截图

c++ gdiplus实现屏幕截图

时间:2023-05-17 13:45:12浏览次数:36  
标签:std 截图 int memdc c++ pImageCodecInfo gdiplus include size

#include <windows.h>
#include <gdiplus.h>
#include <iostream>
#include <filesystem>
#include <chrono>
#include <iomanip>
#include <sstream>

#pragma comment(lib, "Gdiplus.lib") using namespace Gdiplus; ULONG_PTR gdiplusToken; std::wstring StringToWstring(const std::string& s) { int len; int slength = (int)s.length() + 1; len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); wchar_t* buf = new wchar_t[len]; MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); std::wstring r(buf); delete[] buf; return r; } int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = 0; // number of image encoders UINT size = 0; // size of the image encoder array in bytes ImageCodecInfo* pImageCodecInfo = NULL; GetImageEncodersSize(&num, &size); if (size == 0) return -1; // Failure pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); if (pImageCodecInfo == NULL) return -1; // Failure GetImageEncoders(num, size, pImageCodecInfo); for (UINT j = 0; j < num; ++j) { if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0) { *pClsid = pImageCodecInfo[j].Clsid; free(pImageCodecInfo); return j; // Success } } free(pImageCodecInfo); return -1; // Failure } void SaveScreenshot(std::string filename, ULONG uQuality = 100) { ULONG_PTR gdiplusToken; GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); HDC scrdc, memdc; HBITMAP membit; scrdc = ::GetDC(0); int Height = GetSystemMetrics(SM_CYSCREEN); int Width = GetSystemMetrics(SM_CXSCREEN); memdc = CreateCompatibleDC(scrdc); membit = CreateCompatibleBitmap(scrdc, Width, Height); HBITMAP hOldBitmap = (HBITMAP)SelectObject(memdc, membit); BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY); Gdiplus::Bitmap bitmap(membit, NULL); CLSID clsid; int ret = GetEncoderClsid(L"image/png", &clsid); if (ret != -1) { std::wstring wfilename = StringToWstring(filename); bitmap.Save(wfilename.c_str(), &clsid); } SelectObject(memdc, hOldBitmap); DeleteObject(memdc); DeleteObject(membit); ::ReleaseDC(0, scrdc); GdiplusShutdown(gdiplusToken); } std::string GetCurrentTimeStr() { auto now = std::chrono::system_clock::now(); auto in_time_t = std::chrono::system_clock::to_time_t(now); std::tm timeinfo; localtime_s(&timeinfo, &in_time_t); std::stringstream ss; ss << std::put_time(&timeinfo, "%Y-%m-%d-%H-%M-%S"); return ss.str(); } int main() { GdiplusStartupInput gdiplusStartupInput; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); std::string filename = "tmp/" + GetCurrentTimeStr() + ".png"; std::filesystem::create_directories("tmp"); SaveScreenshot(filename); GdiplusShutdown(gdiplusToken); return 0; }

 

标签:std,截图,int,memdc,c++,pImageCodecInfo,gdiplus,include,size
From: https://www.cnblogs.com/whysopt/p/17408505.html

相关文章

  • 【C++ Primer】第二章(2 ~ 6节)
    变量变量提供一个具名的、可供程序操作的存储空间。C++中变量和对象一般可以互换使用。变量定义(define)定义形式:类型说明符(typespecifier)+一个或多个变量名组成的列表。如intsum=0,value,units_sold=0;初始化(initialize):对象在创建时获得了一个特定的值。初......
  • CS106L: Standard C++ Programming, Special Edition
    课程内容涉及C++五大主题:C++介绍、Stream和Types、STL四大模块、OOP面向对象、高级特性(RAII、多线程、元编程)。本系列整合了CS106L课程公开的资料,系统完整的涵盖了C++核心内容,方便学习。搭配《C++Primer》,一起享用更佳!C++课程自学总结CS106L学习时间:刷课一周,复......
  • c++拼图小游戏
    文件目录结构  common.h#pragmaonce#include<iostream>#include<graphics.h>//图形库#include<array>//定长数组#include<algorithm>//乱序算法#include<functional>//仿函数#include<ctime>//时间time函数的头文件usingnamespacestd;//窗口属性类//窗口的宽和高#define......
  • C/C++银行账户管理系统程序[2023-05-06]
    C/C++银行账户管理系统程序[2023-05-06]编写一个银行账户管理系统程序。银行客户信息以一个账户一条记录的形式存储,每个账户记录包含的信息有身份标识号(ID)、姓名、电话、电子邮箱、身份证号、银行卡号、账户余额等信息。具体功能如下:对于银行客户实现①开户,若无账户,申请开户......
  • 1012 数字分类(C++)
    一、问题描述:给定一系列正整数,请按要求对数字进行分类,并输出以下5个数字:A1​ =能被5整除的数字中所有偶数的和;A2​ =将被5除后余1的数字按给出顺序进行交错求和,即计算 n1​−n2​+n3​−n4​⋯;A3​ =被5除后余2的数字的个数;A4​ =被5除后余3的数字......
  • C++学习简记Ⅱ
    二C++数组Array可以在堆(heap)上创建一个数组int*another=newint[5];//其作用域与在栈上创建不同,直到程序把它销毁之前,它都是处于活动状态的,需要用delete关键字来删除delete[]another;使用new动态分配最大的原因是生存期,用new来分配的内存,它将一直存在,直到手动删......
  • C++学习简记Ⅰ
    一指针内容在C中已经熟悉指针本身为一个代表地址的整数指针的*运算符通常被称为dereference运算符,可逆引用指针。引用引用必须引用已经存在的变量,其本身不是变量也不占用内存,相当于变量的别名使用int&类此的形式声明引用变量其作用为向函数传递变量,而不是只传递值,这使......
  • 【C++深度解析】9、const 常量?只读变量?
    文章目录1const常量的判别准则1.1编程实验2小结看了前面的关于const的内容,不知道是不是有疑问,const什么时候为只读变量,什么时候是常量?1const常量的判别准则只有用字面量初始化的const常量才会进入符号表使用其他变量初始化的const常量仍然是只读变量被volatile修......
  • APP自动化-异常截图-利用内存空间(class)
    根据 APP自动化-异常截图-利用内存空间(list),这里还可以使用类的方法。在Package目录下建立一个什么情况下可以操作内存空间.py的文件,里面建立一个类classComtext:#类名可以随便定义pass 然后在conftest1中设置引入类,然后使用python内置函数 setattr函数映射i......
  • c++打卡第二十八天
    一、以圆类Circle及立体图形类Solid为基础设计圆柱类Cylinder1、题目描述以点类Point及平面图形类Plane为基类公有派生圆类Circle,再以圆类Circle及立体图形类Solid为基类公有派生圆柱类Cylinder,main(void)函数完成对圆柱类Cylinder的测试。Point类结构说明:Point类的数据成员......