请参照我上一篇问题给出一个解决方案代码
实现目的:循环截取指定窗口的图像并保存到本地
要求:
1.截屏高效
2.留出我操作的代码区域并标识
3.给代码添加基本注解 以便于我对照学习并找出我的错误。
由于我的后台截屏代码太长,请翻阅上篇提问。
请参照我上一篇问题给出一个解决方案代码
实现目的:循环截取指定窗口的图像并保存到本地
要求:
1.截屏高效
2.留出我操作的代码区域并标识
3.给代码添加基本注解 以便于我对照学习并找出我的错误。
由于我的后台截屏代码太长,请翻阅上篇提问。
以下参考免费微信小程序:皆我百晓生 作答,并由妄北y整理回复。
为了实现循环截取指定窗口的图像并保存到本地的功能,我们可以使用Windows API。以下是一个简单的C++代码示例,它使用PrintWindow
函数来截取指定窗口的图像,并将其保存为PNG文件。
#include <Windows.h>
#include <vector>
#include <Capture.h>
#include <Pathcch.h>
#include <fstream>
// 函数声明
bool CaptureWindow(HWND hWnd, const std::wstring& filePath);
int main() {
// 你的代码区域开始
// 请在这里设置循环逻辑,例如设置一个定时器每隔一段时间调用CaptureWindow函数
// 例如:每5秒截一次屏,你可以使用Sleep函数来实现等待
while (true) {
// 假设我们要截取的窗口句柄是已知的,这里用hWnd代替
HWND hWnd = /* 你的窗口句柄获取代码 */;
// 设置文件名,例如使用当前时间戳
std::wstring filePath = L"screenshot_" + std::to_wstring(GetTickCount()) + L".png";
// 调用截屏函数
if (CaptureWindow(hWnd, filePath)) {
// 截屏成功,可以在这里添加你的代码
} else {
// 截屏失败,可以在这里添加错误处理代码
}
// 等待一段时间再次截屏
Sleep(5000); // 5000毫秒,即5秒
}
// 你的代码区域结束
return 0;
}
// 截屏并保存为PNG文件的函数
bool CaptureWindow(HWND hWnd, const std::wstring& filePath) {
// 声明内存设备上下文(DC)
HDC hMemDC = CreateCompatibleDC(NULL);
if (!hMemDC) return false;
// 使用PrintWindow函数截取窗口
HBITMAP hBitmap = (HBITMAP)PrintWindow(hWnd, hMemDC, PW_CLIENTONLY);
if (!hBitmap) {
DeleteDC(hMemDC);
return false;
}
// 创建一个与位图兼容的DC
HDC hDC = CreateCompatibleDC(NULL);
if (!hDC) {
DeleteObject(hBitmap);
DeleteDC(hMemDC);
return false;
}
// 将位图选入新创建的DC
HGDIOBJ hOldBitmap = SelectObject(hDC, hBitmap);
// 获取位图信息
BITMAP bmp;
GetObject(hBitmap, sizeof(BITMAP), &bmp);
// 创建一个临时路径用于保存截屏
wchar_t tempPath[MAX_PATH];
if (!GetTempPathW(MAX_PATH, tempPath)) {
SelectObject(hDC, hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(hMemDC);
DeleteDC(hDC);
return false;
}
// 拼接临时文件名
wstring tempFileName = L"temp_screenshot.png";
wstring tempFilePath = tempPath + L"\\" + tempFileName;
// 保存位图到文件
GUID encoder = { 0x557cf400, 0x1a2b, 0x48a7, { 0x8f, 0x9c, 0x7a, 0x7e, 0xf7, 0x67, 0x6d, 0xee } };
HRESULT hr = SaveHbitmapAsPng(hDC, hBitmap, tempFilePath.c_str(), &encoder);
if (hr != S_OK) {
SelectObject(hDC, hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(hMemDC);
DeleteDC(hDC);
return false;
}
// 将临时文件移动到目标路径
MoveFileW(tempFilePath.c_str(), filePath.c_str());
// 清理资源
SelectObject(hDC, hOldBitmap);
DeleteObject(hBitmap);
DeleteDC(hMemDC);
DeleteDC(hDC);
return true;
}
// 将HBITMAP保存为PNG文件的辅助函数
HRESULT SaveHbitmapAsPng(HDC hDC, HBITMAP hBitmap, LPCWSTR pszFilePath, const GUID* pEncoder) {
// 创建一个IWICImagingFactory接口实例
IWICImagingFactory* pWICFactory = NULL;
HRESULT hr = CoCreateInstance(
CLSID_WICImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IWICImagingFactory,
(LPVOID*)&pWICFactory
);
if (FAILED(hr)) return hr;
// 创建一个IWICBitmap对象
IWICBitmap* pWICBitmap = NULL;
hr = pWIC