[英]SDL2 on Arch Linux: window renders what's on the screen behind it
[英]Capturing the screen behind the window
我想编写一个 Windows C++ 应用程序,其中窗口的内容是窗口后面的任何内容(就像窗口是透明的一样)。 也就是说,我想检索我的窗口的边界框; 捕获下面的那些坐标,并将它们绘制在我的窗口上。 因此,我可以在捕获期间排除窗口本身至关重要。
“为什么不让窗户透明?” 你问。 因为我的下一步是对该图像进行修改。 我想对其应用一些任意过滤器。 例如,假设我想模糊该图像,以便我的窗户看起来像磨砂玻璃。
我尝试使用https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2 上的放大 API 示例,它实际上为我提供了除窗口之外的屏幕内容。 但是,重新渲染图像是在计时器中完成的,这会导致图像非常抖动; 我无法弄清楚如何检索和应用任意转换到该图像。
我不知道从哪里开始,此时真的可以使用一些指针。 对不起,如果我是从一个愚蠢的角度来处理这个问题。
编辑:我正在添加我的意思的模型:
编辑 2:就像在放大 API 示例中一样,视图将不断刷新(尽可能频繁,为了论证而说每 16 毫秒)。 参见Visolve Deflector示例; 尽管它不会对捕获的区域施加任何影响。
同样,我将在之后修改图像数据; 因此我不能使用放大 API 的内核矩阵支持。
您可以从修改 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);
}
对于更高级的效果,您可以将内容 blit 到内存设备上下文。
您没有指定这是否是一次性活动,或者您需要在窗口后面连续不断地显示内容(例如放大镜/等)。 如果是连续的,您可能需要的更新频率是多少。
无论如何,在任何一种情况下,我都会看到两个主要用例:
因此,如果您可以放弃非常量/动画背景用例,则解决方案在一次性和连续流情况下都非常简单:
WM_MOVE
/ WM_SIZE
并为新尺寸重复上述过程。此外,如果您需要精确,请将SetWindowsHookEx用于 CBT/等。
从我的头顶角案例:
希望这有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.