使用PrintWindow API获取屏幕截图(客户端区域)

时间:2013-02-14 06:16:09

标签: c++ mfc

使用PrintWindow API截取特定窗口(hwnd)的屏幕截图。这个工作绝对正常,它需要整个窗口的截图。我的问题是:我的窗户高度是742&宽度是653.如果我想在窗口中间某处拍摄屏幕截图(不是从0,0开始)。我如何指定x& PrintWindow中的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& amp; StretchBlt我们可以选择指定x& y轴。但对于我的项目来说,时间效率非常重要。当我尝试使用BitBlt& StretchBlt时间效率约为25ms。但是当我用PrintWindow拍摄截图时,其时间效率为6~8ms。所以这对我的项目来说非常合适。

但PrintWindow API始终从(0,0)捕获窗口图像。有人可以告诉/建议我如何在指定位置拍摄窗口的屏幕截图,例如x = 20& Y = 30。

谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

但这些只是提示,你需要自己做研究。