使用 PrintWindow API 截屏(客户区)

Posted

技术标签:

【中文标题】使用 PrintWindow API 截屏(客户区)【英文标题】:Taking Screenshot ( client area ) using PrintWindow API 【发布时间】:2013-01-29 21:38:12 【问题描述】:

我正在使用 PrintWindow API 截取特定窗口 (hwnd)。这工作得很好,它会截取整个窗口。我的问题是:我的窗口高度是 742,宽度是 653。如果我想在窗口中间的某个地方截屏(不是从 0,0 开始)。我将如何在 PrintWindow 中指定 x 和 y 轴。我的 snipnet 代码如下所示:

void Screenshot()

  CImage image;
  image.Create(imageWidth, imageHeight, 24);
  CImageDC imageDC(image);

  HWND hwnd = ::FindWindow(0,"EIML");

  PrintWindow(hwnd, imageDC, PW_CLIENTONLY);

  image.Save("H:\\out.jpg",ImageFormatJPEG);
  

我已经尝试过 BitBlt 和 StretchBlt 等替代方法,我们可以选择指定 x 和 y 轴。但是对于我的项目时间效率是非常非常重要的。当我尝试使用 BitBlt 和 StretchBlt 时,时间效率约为 25 毫秒。但是当我用 PrintWindow 截屏时,它的时间效率是 6~8ms。所以这将非常适合我的项目。

但 PrintWindow API 总是从 (0,0) 捕获窗口图像。有人可以告诉我/建议我如何在指定位置截取窗口的屏幕截图,例如 x=20 和 y=30。

谢谢。

【问题讨论】:

【参考方案1】:

显然,不可能为PrintWindow 指定一个矩形,因为它不接受这样的参数。

可能有一个解决方法。尝试使用SelectClipRgn 为设备上下文指定剪辑区域。使用CreateRectRgn 从矩形创建一个区域。如果幸运的话,WM_PAINT 处理程序会考虑到剪切区域。

您可以尝试使用SetWindowOrg/SetViewportOrg 指定偏移量。

但这些只是提示,您需要自己进行研究。

【讨论】:

好的,谢谢你的指导。我会试试这个。

以上是关于使用 PrintWindow API 截屏(客户区)的主要内容,如果未能解决你的问题,请参考以下文章

MFC PrintWindow(CPaintDC) 有效,但 PrintWindow(CDC) 无效

Autoit中用PrintWindow替代ScreenCapture函数实现截图

Windows 10 中非活动桌面上的 PrintWindow

如何通过 C# 将桌面截屏为图片?

Printwindow 打印有空白区域

隐藏窗口的 PrintWindow 和 BitBlt