繁体   English   中英

特定窗口 C++ 的屏幕截图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM