捕获窗口后面的屏幕

kub*_*tto 5 c++ windows winapi

我想编写一个 Windows C++ 应用程序,其中窗口的内容是窗口后面的内容(就好像窗口是透明的一样)。也就是说,我想检索窗口的边界框;捕获下面的这些坐标,并将它们绘制在我的窗口上。因此,在捕获过程中排除窗口本身至关重要。

“为什么不让窗户透明呢?” 你问。因为我的下一步是对该图像进行修改。我想对其应用一些任意过滤器。例如,假设我想模糊该图像,使我的窗户看起来像毛玻璃。

我尝试使用https://code.msdn.microsoft.com/windowsdesktop/Magnification-API-Sample-14269fd2上的放大 API 示例 ,它实际上为我提供了不包括窗口的屏幕内容。然而,重新渲染图像是在计时器中完成的,这会导致图像非常抖动;我不知道如何检索该图像并将其应用任意变换。

我不知道从哪里开始,此时确实可以使用一些指针。抱歉,如果我是从一个愚蠢的角度来处理这个问题的。

编辑:我正在添加我的意思的模型:

例子

编辑 2:就像放大 API 示例一样,视图将不断刷新(尽可能频繁地刷新,为了论证起见,假设每 16 毫秒刷新一次)。请参阅Visolve Deflector示例;尽管它不会对捕获区域施加任何效果。

再次强调,之后我将修改图像数据;因此我无法使用放大 API 的内核矩阵支持。

Dan*_*Sęk 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); 
} 
Run Code Online (Sandbox Code Playgroud)

使用颜色矩阵变换单色

对于更高级的效果,您可以将内容复制到内存设备上下文。