如何在c++中获得窗口截图作为位图对象
How to get screenshot of a window as bitmap object in C++?
如何在c++中获得窗口的屏幕截图作为位图对象?假设我已经有了窗户把手。我也想知道是否有可能得到一个窗口的截图时,它在最小化状态?
c++这里指的是带有Windows XP+ (win32)相关库的vc++。
你应该调用printwwindow API:
void CScreenShotDlg::OnPaint()
{
// device context for painting
CPaintDC dc(this);
// Get the window handle of calculator application.
HWND hWnd = ::FindWindow( 0, _T( "Calculator" ));
// Take screenshot.
PrintWindow( hWnd,
dc.GetSafeHdc(),
0 );
}
看到这个问题:获取窗口截图windows API
如果你不使用MFC,这里是纯printwinwindow签名:
BOOL PrintWindow(
HWND hwnd,
HDC hdcBlt,
UINT nFlags
);
请参阅MSDN了解更多详细信息:http://msdn.microsoft.com/en-us/library/dd162869(v=vs.85).aspx
关于如何将其保存为位图,正如matteo所说,这取决于您使用的实际框架…
编辑:这里是c++的完整示例
#define _WIN32_WINNT 0x0501 //xp
#include <windows.h>
int main()
{
RECT rc;
HWND hwnd = FindWindow(TEXT("Notepad"), NULL); //the window can't be min
if (hwnd == NULL)
{
cout << "it can't find any 'note' window" << endl;
return 0;
}
GetClientRect(hwnd, &rc);
//create
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
rc.right - rc.left, rc.bottom - rc.top);
SelectObject(hdc, hbmp);
//Print to memory hdc
PrintWindow(hwnd, hdc, PW_CLIENTONLY);
//copy to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbmp);
CloseClipboard();
//release
DeleteDC(hdc);
DeleteObject(hbmp);
ReleaseDC(NULL, hdcScreen);
cout << "success copy to clipboard, please paste it to the 'mspaint'" << endl;
return 0;
}
如果有人对最小化窗口的printwwindow图片感兴趣,这里你可以得到这个想法,如何完成这件事:http://www.codeproject.com/Articles/20651/Capturing-Minimized-Window-A-Kid-s-Trick
快乐编码;)
看起来printwwindow正在使用frontbuffer。我试着用IE截图。打开新的链接,并尝试获取图片。它将显示前一个链接的图片。
相关文章:
- C / C++ 移位/偏移/向左或向右移动位图?
- 如何在快板的屏幕中显示子位图的绘制?
- CreateDIBSection为同一图像返回不一致的位图位值
- C++ 位图中的 ttc 字体
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 难以从 CImageList 设置菜单项位图
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 如何使用 freetype2 访问单色位图中的像素状态
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 位图到垫子/2D 数组
- Gdiplus位图没有Alpha通道
- 如何从路径字符串加载Gdiplus::位图
- 在C++中使用Gdiplus创建透明位图
- 如何从依赖于设备的 HBITMAP 构造 GDI+ 位图对象
- 错误 C2440:无法将"系统::D rawing::位图"转换为"系统::对象"
- 有没有办法在更改与 HDC 关联的位图大小后更新图形对象?
- 使用GDI+删除位图和CLSID对象时,C++内存管理失败
- 从gdiplus (GDI+)中的设备上下文或图形对象中获取图像/位图
- 如何在c++中获得窗口截图作为位图对象