WGC窗口抓屏代码
时间: 2023-07-02 22:11:29 浏览: 285
以下是使用 Win32 API 实现窗口抓屏的示例代码:
```c++
#include <windows.h>
int main()
{
// 获取窗口句柄
HWND hWnd = FindWindow(NULL, TEXT("窗口标题"));
// 获取窗口矩形
RECT rect;
GetWindowRect(hWnd, &rect);
// 计算窗口大小
int width = rect.right - rect.left;
int height = rect.bottom - rect.top;
// 创建设备上下文
HDC hdcScreen = GetDC(NULL);
HDC hdcWindow = GetDC(hWnd);
HDC hdcMem = CreateCompatibleDC(hdcScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, width, height);
SelectObject(hdcMem, hBitmap);
// 截取窗口图像
BitBlt(hdcMem, 0, 0, width, height, hdcWindow, 0, 0, SRCCOPY);
// 保存图像到文件
BITMAPINFOHEADER bih;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biWidth = width;
bih.biHeight = height;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biCompression = BI_RGB;
bih.biSizeImage = 0;
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
BITMAPFILEHEADER bfh;
bfh.bfType = 0x4d42;
bfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + width * height * 3;
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
HANDLE hFile = CreateFile(TEXT("screenshot.bmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwWritten;
WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(hFile, &bih, sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
BYTE* pBits = new BYTE[width * height * 3];
GetDIBits(hdcMem, hBitmap, 0, height, pBits, (BITMAPINFO*)&bih, DIB_RGB_COLORS);
WriteFile(hFile, pBits, width * height * 3, &dwWritten, NULL);
delete[] pBits;
CloseHandle(hFile);
// 释放资源
DeleteObject(hBitmap);
DeleteDC(hdcMem);
ReleaseDC(hWnd, hdcWindow);
ReleaseDC(NULL, hdcScreen);
return 0;
}
```
其中,`FindWindow` 函数用于获取窗口句柄,`GetWindowRect` 函数用于获取窗口矩形,`CreateCompatibleDC` 函数用于创建设备上下文,`CreateCompatibleBitmap` 函数用于创建位图,`SelectObject` 函数用于选择位图到设备上下文,`BitBlt` 函数用于截取窗口图像,`GetDIBits` 函数用于获取位图数据,`CreateFile` 函数用于创建文件,`WriteFile` 函数用于写入文件,`DeleteObject` 函数用于删除位图,`DeleteDC` 函数用于删除设备上下文,`ReleaseDC` 函数用于释放设备上下文。
请注意,该示例代码只能在 Windows 系统下编译和运行。如果需要在其他系统下进行窗口抓屏,需要使用相应的 API 实现。
阅读全文