我想编写一个Windows C ++应用程序,其中窗口的内容是窗口后面的内容(就像窗口是透明的一样)。也就是说,我想要检索窗口的边界框;捕获下面的坐标,并在我的窗口上绘制它们。因此,在捕获过程中我可以排除窗口本身至关重要。
"为什么不让窗户透明?"你问。因为我的下一步是对该图像进行修改。我想对它应用一些任意的过滤器。例如,我们只是说我想模糊那个图像,这样我的窗口就像一个磨砂玻璃。
我尝试在https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2使用放大率API示例,它实际上为我提供了不包括窗口的屏幕内容。然而,重新渲染图像是在计时器中完成的,这导致非常抖动的图像;而且我无法弄清楚如何检索和应用任意转换到该图像。
我不知道从哪里开始,现在真的可以使用一些指针。对不起,如果我从一个愚蠢的角度来看这个。
编辑:我正在添加一个模拟我的意思:
编辑2:就像在放大API示例中一样,视图会不断刷新(尽可能频繁地说,只是为了参数而每16毫秒)。有关示例,请参阅Visolve Deflector;虽然它对捕获的区域没有任何影响。
再次,我将在之后修改图像数据;因此我无法使用Magnification API的内核矩阵支持。
答案 0 :(得分:1)
您可以从修改MAGCOLOREFFECT开始。在MagnifierSample.cpp中我们有:
if (ret)
{
MAGCOLOREFFECT magEffectInvert =
{{ // MagEffectInvert
{ -1.0f, 0.0f, 0.0f, 0.0f, 0.0f },
{ 0.0f, -1.0f, 0.0f, 0.0f, 0.0f },
{ 0.0f, 0.0f, -1.0f, 0.0f, 0.0f },
{ 0.0f, 0.0f, 0.0f, 1.0f, 0.0f },
{ 1.0f, 1.0f, 1.0f, 0.0f, 1.0f }
}};
ret = MagSetColorEffect(hwndMag,&magEffectInvert);
}
Using a Color Matrix to Transform a Single Color
对于更高级的效果,您可以将内容blit到内存设备上下文。
答案 1 :(得分:1)
您没有指定这是一次性活动,还是您需要在窗口后面连续播放什么(如放大镜/等)。如果是连续的,那么您可能需要更新的频率。
无论如何,在任何一种情况下,我都会看到两个主要用例:
因此,如果您可以放弃非常量/动画背景用例,那么在单镜头和连续流案例中解决方案都非常简单:
WM_MOVE
/ WM_SIZE
,并针对新尺寸重复上述过程。此外,如果您需要精确,请使用SetWindowsHookEx进行CBT /等。
我头顶的角落案例:
希望这有帮助!
答案 2 :(得分:0)