【发布时间】:2018-03-12 23:15:43
【问题描述】:
我想编写一个 Windows C++ 应用程序,其中窗口的内容是窗口后面的任何内容(就好像窗口是透明的一样)。也就是说,我想检索我的窗口的边界框;捕获下面的这些坐标,并将它们绘制在我的窗口上。因此,我可以在捕获期间排除窗口本身是至关重要的。
“为什么不让窗口透明呢?”你问。因为对我来说下一步是修改该图像。我想在上面应用一些任意过滤器。例如,假设我想模糊该图像,使我的窗户看起来像一块磨砂玻璃。
我尝试使用 https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2 的放大 API 示例,它实际上为我提供了不包括我的窗口的屏幕内容。但是,重新渲染图像是在计时器中完成的,这会导致图像非常抖动;而且我不知道如何检索该图像并将任意转换应用于该图像。
我不知道从哪里开始,在这一点上真的可以使用一些指针。对不起,如果我从愚蠢的角度来处理这个问题。
编辑:我正在添加我的意思的模型:
编辑 2: 就像在放大 API 示例中一样,视图会不断刷新(尽可能频繁,为了论证的缘故,每 16 毫秒说一次)。示例见Visolve Deflector;尽管它不会对捕获的区域施加任何影响。
再次,我将在之后修改图像数据;因此我无法使用 Magnification API 的内核矩阵支持。
【问题讨论】:
-
blur effect 已经有一个 API。
-
模糊效果是一个例子,我想对图像应用任意变换。
-
这似乎不太现实,因为它需要侵入合成管理器的工作(这就是提到的放大 API 似乎执行的操作)。也许隐藏您的窗口并截取后面的任何内容以显示为窗口内容就足够了,或者您需要动态更新它?
-
在这种情况下是否可以使用放大API检索图像,然后从组件中读取图像数据?
-
屏幕截图不需要放大 API。只需创建一个位图,然后将
BitBlt从桌面创建到该位图。见example