繁体   English   中英

捕捉窗后的屏幕

[英]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 到内存设备上下文。

您没有指定这是否是一次性活动,或者您需要在窗口后面连续不断地显示内容(例如放大镜/等)。 如果是连续的,您可能需要的更新频率是多少。

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

  1. 你的应用背后的内容是不变的你可能不相信,但大多数时候你的窗口背后的内容不会改变
  2. 窗口后面的内容正在改变/动画:这是一个更棘手的情况。

因此,如果您可以放弃非常量/动画背景用例,则解决方案在一次性和连续流情况下都非常简单:

  1. 隐藏您的应用程序窗口
  2. 截取屏幕截图并缓存!
  3. 显示您的应用程序(裁剪除应用程序主窗口边界框之外的所有内容),现在用户可以应用过滤器
  4. 即使用户更改了过滤器,也要将其重新应用于缓存图像。
  5. 跟踪窗口的WM_MOVE / WM_SIZE并为新尺寸重复上述过程。

此外,如果您需要精确,请将SetWindowsHookEx用于 CBT/等。

从我的头顶角案例:

  1. 通知图标/气球工具提示
  2. 桌面后台调度(windows第三方应用)
  3. 应用程序特定的消息框等!

希望这有帮助!

我已经使用“GetForeGroundWindow”和“PrintWindow”实现了类似的东西。

这有点牵连,但这是一张图片。 图像随其来源更新,但速度很慢,因此存在明显滞后(即 .2 秒 = .5 秒),而不是我选择了 SinWave 效果的模糊效果。 另外,使用 GetForeGroundWindow 基本上意味着它只能复制一个窗口的内容。 如果您想听到更多,请回复,我将整理一些步骤和示例存储库。 在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM