我尝试抓取 Windows 10 上的特定窗口。我阅读了 MSDN 的一些文章以熟悉 API。我的目标是抓住一些特定的窗口,即使它们上面有一些窗口(相当于 OS X CGWindowList API
)。因此,如果有 2 个窗口:A
和B
,并且 windowsB
部分重叠 window A
,我希望能够捕获窗口A
内容,而不捕获B
部分覆盖窗口的窗口。
根据这个链接,有5种不同的截屏方式,如果我理解正确的话,它们中的大多数只能截取屏幕上的某些区域,即它们不区分窗口。唯一允许抓取特定窗口的 API 是“旧备用,GDI”。
我尝试使用GetWindowDC()
函数获取 Windows 的设备上下文,创建兼容的位图,然后使用位块传输 ( BitBlt()
)。但是,它似乎并不总是按预期工作。
我注意到 Windows 10 上的几个问题(未在其他操作系统上测试):
- 窗口的标题栏通常不会被捕获。我试图打开记事本并捕获窗口,但它没有被完全捕获,部分滚动条和标题栏没有被捕获。我试图捕获记事本的子窗口,但它没有按预期工作,而且一些子窗口的坐标似乎是错误的(
msctls_statusbar32msctls_statusbar32
记事本的子窗口的宽度是实际宽度的 3 倍)窗户)。 - 有些应用程序根本没有被捕获。例如,像“照片”、“计算”、“设置”这样的应用程序不会用这种方法捕获,当我尝试捕获它们时,我会得到一个黑色位图。应该有一个允许捕获此类窗口的 API,例如 TeamViewer 能够捕获这些窗口。似乎所有此类窗口都是按
ApplicationFrameHost.exe
进程呈现的。
有谁知道如何解决这些问题?