全屏覆盖桌面的叠加层

3
我正在尝试创建一个全屏幕叠加层,可以改变整个屏幕的颜色/饱和度等,并添加一些文本和效果。基本上,我想要“替换”整个屏幕,同时用户仍然可以正常与Windows进行交互。 解决方案1 问题在于,如果我只是在整个屏幕上创建一个TopMost窗口,用户将无法与该窗口下面的任何内容进行交互。 解决方案2 简单地在桌面缓冲区上绘图也无法解决这个问题。当窗口移动时会出现不良影响,而且还会产生很重的运动模糊效果。这永远不会看起来好。 解决方案3 在C#中钩取“桌面绘制事件”是不可能的,因为我必须将DLL注入到explorer.exe中。这不是一个漂亮的解决方案,也不适用于C#。此外,防病毒程序很可能会将其检测为有害物品。
我看到的最接近的东西是这个,但是用户将无法“点击穿透”覆盖层。在示例中,覆盖层主要是完全透明的。使用透明键以外的颜色将导致解决方案1的问题。
问题:如何有效地叠加整个屏幕上的效果?

1
我很想知道这是否可能。我的直觉告诉我绝对不可能。 - Jonesopolis
1个回答

0

未经测试

听起来你的问题是关于点击。为了通过鼠标消息,你是否考虑拦截顶层窗口上的鼠标点击(假设该窗口已设置为透明窗口),然后隐藏你的窗口,使用user32导入的SendMessage发送相同的鼠标消息,然后再显示你的窗口?如果你不想隐藏你的窗口,你也可以直接调用SendMessage来处理其他窗口句柄。

以下链接展示了如何在你的应用程序中循环遍历桌面上的窗口:

http://support.microsoft.com/kb/183009

我认为如果您已经将窗体设置为透明,那么您也可以重写CreateParams。这样做可能会使鼠标事件穿过窗体。

// This may be even simpler
protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
    }
}

在新的Windows表单中,您可以使表单本身透明:

public void MakeSeeThru()
{
   frmTransparentForm.Opacity = 0.83;
}

上述方法仅适用于表单。要在子控件上实现此功能需要更多的工作。首先,您必须设置样式以支持透明背景色。

public TransparentControl()
{
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    this.BackColor = Color.Transparent.
}

如果控件是透明的,这并不妨碍您重写OnPaintBackground和OnPaint方法,并自定义绘制。它只会使用默认的透明背景进行绘制。
我以前做过这个,如果它移动时会有一点模糊。但是,如果整个界面是一个覆盖桌面的巨大透明窗体,就不会出现运动模糊。
如果这样会导致性能问题,并且想要自定义绘制桌面,您可以像下面这样获取屏幕截图:
ScreenCapture sc = new ScreenCapture();
// capture entire screen, and save it to a file
Image img = sc.CaptureScreen();

你需要先隐藏你的表单,但这可能会导致闪烁。


我认为Windows窗体拥有一个CreateParams属性可以被覆盖。这可能会使顶部窗体对鼠标事件透明。 - Ted
这是一个非常好的想法!我唯一看到的缺点是它会导致运动模糊效果。你看,我从屏幕上复制图像到表单上。表单不会透明,所以我们只能看到表单上的内容。那么,如果我们看到我们的“假”图像(即表单),怎么复制桌面图像呢? - bytecode77
基本上我们需要做的就是复制屏幕内容,但不包括覆盖表单。这是否有可能? - bytecode77
好的,它仍然会导致运动模糊和一些质量损失。如果我想创建一个颜色反转效果怎么办?在这种情况下,“Opacity”将不起作用。实际上,我希望该表单具有“Opacity”为“1”,以便我可以完全选择应显示什么,而不会有运动模糊。是否有可能隐藏表单,捕获屏幕并重新显示它而不会出现闪烁/滞后?我尝试了但没找到解决方法。 - bytecode77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接