使用 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函数实现截图