屏幕捕获特定窗口

ron*_*nag 12 c++ windows winapi gdi

是否可以屏幕捕获特定窗口(也可能是另一个进程)?

目前我正在捕获特定监视器的整个桌面,但我真正想要的是捕获特定窗口的内容(无论其位置如何).

Blo*_*ood 12

是的.您需要的只是获取要捕获的窗口的句柄,并使用WinAPI函数PrintWindow,例如:

// Get the window handle of calculator application.
HWND hWnd = ::FindWindow( 0, _T( "Calculator" ));

// Take screenshot.
PrintWindow( hWnd, getDC(hWnd), 0 );
Run Code Online (Sandbox Code Playgroud)

这里有PrintWindow文档.

  • 从[PrintWindow](https://msdn.microsoft.com/zh-cn/library/windows/desktop/dd162869.aspx)文档中:*“拥有hWnd引用的窗口的应用程序会收到一个WM_PRINT消息或WM_PRINTCLIENT消息。“ *-换句话说:源窗口必须实现`WM_PRINT` /`WM_PRINTCLIENT`消息处理程序。如果没有,``PrintWindow`将不起作用。这不是一般的解决方案。 (3认同)
  • 如何在 PrintWindow 之后继续并保存屏幕截图(或获取数据)? (2认同)

Dea*_*nna 8

是的,就像捕捉全屏一样简单.你只需要使用GetWindowDC()所需的窗口上,而不是GetDesktopWindow(),然后BitBlt()从你的目标DC.您也可以使用获得正确的大小GetWindowRect().

请注意,此方法还允许您从隐藏/覆盖窗口捕获带有边界矩形的完整屏幕截图.

有关详细信息,请参阅此问题.