[英]Screen capture of specific window c++
我想截取某个特定窗口(例如计算器)的屏幕截图。
这是我根据这个讨论编写的代码:
// Get the window handle of calculator application.
HWND hWnd = ::FindWindow(0, _T("Calculator"));
RECT r;
GetWindowRect(hWnd, &r);
int x[2]; int y[2];
x[0] = r.top; x[1] = r.bottom;
y[0] = r.left; y[1] = r.right;
HDC hScreen = GetWindowDC(hWnd);
HDC hDC = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, y[1] - y[0], x[1] - x[0]);
HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
BitBlt(hDC, 0, 0, y[1] - y[0], x[1] - x[0], hScreen, y[0], x[0], SRCCOPY);
之后,我将位图保存为 .bmp 图像。
结果具有计算器窗口的正确大小和位置,但生成的 bmp 全黑。
我尝试对整个桌面进行截图,然后剪切计算器部分,结果奏效了。 但我希望能够制作窗口的屏幕截图,即使它被最小化或被另一个窗口覆盖。
任何想法为什么此代码不起作用或有其他方法可以做到吗?
谢谢。
一种可供考虑的方法是CreateForWindow 。
考虑到目标窗口是可移动的,另一个角度是将其重新定位到当前桌面的左上角。 执行整个屏幕的捕获,然后,假设您知道窗口的尺寸,将其裁剪为这些尺寸。
如果安全程序可以被暂停或终止,目标窗口没有隐藏,或者以上述评论中讨论的方式合成,或者当 Aero 可以暂时禁用时,这有更好的成功机会。
最简单的方法是使用PrintWindow 。
下面是一些例子:
PrintWindow(calculatorHwnd, destHwnd, 0);
PrintWindow(calculatorHwnd, destHwnd, PW_CLIENTONLY);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.