【问题标题】:Is it possible to capture a window with windows 7 DWM thumbnail in it?是否可以捕获包含 Windows 7 DWM 缩略图的窗口?
【发布时间】:2011-01-12 20:49:35
【问题描述】:

我开始相信你不能用 Windows API 做任何事情。

我有两个窗口。其中有一个 DWM 缩略图。我想要做的是,我希望能够将带有缩略图的窗口屏幕捕获到另一个窗口中。 当我这样做时,使用 bitblt,除了缩略图之外的所有内容都被复制。它只是不在位图中。

那么 DWM 渲染是如何工作的呢?我的意思是,如果 DWM 将缩略图直接渲染到注册窗口的 DC 上,那么我的方法应该可行。我很困惑。

非常感谢。

【问题讨论】:

  • 有一个 Windows 7 API SDK,您可以从 Microsoft 下载.. ;)
  • 它与 Win 7 自带的库有什么不同?

标签: winapi windows-7 dwm


【解决方案1】:

这不是 DWM 的工作方式:缩略图的内容永远不会被 blitted 到窗口的 DC 上。相反,当呈现桌面时,DWM 合成引擎将直接在窗口内容上呈现缩略图。

遗憾的是,没有(官方)方法可以访问 DWM 缩略图的图像数据(不过,网络上有一个 hack 试图访问底层顶点数据并在 DirectX 9 中呈现它)。

【讨论】:

  • 刚刚自己在Win10上尝试过,发现它就像OP一样失败。为什么 Alt+PrntScr 粘贴到 mspaint 时会抓取所有内容?
  • 公平点:不同之处在于 DWM 缩略图不会主动 blit 任何内容到窗口的绘图上下文中。 DWM 缩略图仅提醒窗口合成器在渲染将要进入屏幕的最终像素时在另一个窗口上合成一个窗口。当屏幕抓取时,您抓取最终渲染,因此也能够获取合成窗口:例如,尝试在您自己的窗口上使用窗口捕获 API,您应该能够获取所有内容(原始窗口内容 + 缩略图)。
  • 您认为哪些窗口捕获 API 可以使用?我试过在 DC 本身中获取位图,我试过 BitBlt,我试过 PrintWindow,似乎没有一个适合我。
  • 注意:我没有测试过这些,它们只是可行的方法。 当通过 GDI 进行屏幕捕获时,我认为您应该屏幕捕获桌面窗口本身,而不是您尝试克隆的特定窗口。这样您就可以获得桌面的输出,而不是源窗口的内容(当然,您必须裁剪桌面才能只获得您感兴趣的窗口)。否则,您可能会研究如何做到这一点with DirectXnew UWP APIs
  • 谢谢,我会研究这些选项。我忘了提及,我捕获特定窗口的原因是因为当这些窗口位于 Z 顺序中的其他窗口之后时,我需要捕获这些窗口。因此它们被有效地遮盖了,并且不会通过捕获桌面来显示。这就是为什么我首先获得窗口本身的 DC。
【解决方案2】:

您不能期望缩略图被放置在窗口的设备上下文中,因为缩略图没有放置在窗口的设备上下文中。所以你的方法行不通。

但如果您想窃取应用程序的缩略图,只需询问Dwm to give you it's thumbnail。这将允许您向用户展示您想要的确切缩略图。

另一方面,如果您想访问另一个进程的缩略图中的像素,那么您就有问题了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 2015-10-16
    相关资源
    最近更新 更多