捕获窗口后面的屏幕

时间:2017-10-01 19:31:13

标签: c++ windows winapi

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

"为什么不让窗户透明?"你问。因为我的下一步是对该图像进行修改。我想对它应用一些任意的过滤器。例如,我们只是说我想模糊那个图像,这样我的窗口就像一个磨砂玻璃。

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

我不知道从哪里开始,现在真的可以使用一些指针。对不起,如果我从一个愚蠢的角度来看这个。

编辑:我正在添加一个模拟我的意思:

example

编辑2:就像在放大API示例中一样,视图会不断刷新(尽可能频繁地说,只是为了参数而每16毫秒)。有关示例,请参阅Visolve Deflector;虽然它对捕获的区域没有任何影响。

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

3 个答案:

答案 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)

您没有指定这是一次性活动,还是您需要在窗口后面连续播放什么(如放大镜/等)。如果是连续的,那么您可能需要更新的频率。

无论如何,在任何一种情况下,我都会看到两个主要用例:

  1. 您应用背后的内容常数您可能不相信,但是 大多数情况下,窗口后面的内容不会改变
  2. 您窗口后面的内容是更改/动画:这是一个 棘手的案例。
  3. 因此,如果您可以放弃非常量/动画背景用例,那么在单镜头和连续流案例中解决方案都非常简单:

    1. 隐藏您的应用程序窗口
    2. 截取屏幕截图,然后将其缓存!
    3. 显示您的应用程序(裁剪除应用程序主窗口边框之外的所有内容),现在用户可以应用过滤器
    4. 即使用户更改了过滤器,也请将其重新应用于缓存图像。
    5. 跟踪您的窗口WM_MOVE / WM_SIZE,并针对新尺寸重复上述过程。
    6. 此外,如果您需要精确,请使用SetWindowsHookEx进行CBT /等。

      我头顶的角落案例:

      1. 通知图标/气球工具提示
      2. 桌面后台安排(Windows第三方应用)
      3. 特定于应用程序的消息框等!
      4. 希望这有帮助!

答案 2 :(得分:0)

使用“ GetForeGroundWindow”和“ PrintWindow”已经达到了类似的目的。

有点涉及,但这是一张图片。图片会使用其源进行更新,但是速度较慢,因此会有很大的延迟(即.2秒= .5秒) 我选择了SinWave效果而不是模糊效果。同样,使用GetForeGroundWindow基本上意味着它只能复制一个窗口的内容。如果您想听听更多,请回复,我将整理一些步骤和一个示例存储库。 enter image description here