4

我正在使用 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。

谢谢你。

4

1 回答 1

0

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

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

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

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

于 2013-02-14T10:35:40.097 回答