我正在使用PrintWindow API拍摄特定窗口(hwnd)的屏幕截图。这绝对可以正常工作,它需要整个窗口的屏幕截图。我的问题是:我的窗口高度是742,宽度是653。如果我想将屏幕截图截取到窗口中间的某处(不是从0,0开始)。我将如何在PrintWindow中指定x和y轴。我的片段网络代码如下所示:
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时,时间效率约为25ms。但是,当我使用PrintWindow截屏时,其时间效率为6〜8ms。因此,这将非常适合我的项目。
但是PrintWindow API始终从(0,0)捕获窗口图像。有人可以告诉我/建议我如何在指定位置拍摄窗口的屏幕截图,例如x = 20&y = 30。
谢谢你。
最佳答案
显然,不可能为PrintWindow
指定一个矩形,因为它不接受这样的参数。
有一种可能是解决方法。尝试使用SelectClipRgn
为设备上下文指定剪切区域。使用CreateRectRgn
从矩形创建区域。如果幸运的话,WM_PAINT处理程序将考虑裁剪区域。
您可以尝试使用SetWindowOrg
/SetViewportOrg
指定偏移量。
但这只是提示,您需要自己进行研究。