全屏覆盖桌面

时间:2013-07-19 17:03:58

标签: c# .net drawing

我正在尝试在整个屏幕上创建一个全屏覆盖,这将改变整个屏幕的颜色/饱和度等,并添加一些文本和效果。基本上我想“替换”整个屏幕,而用户仍然能够与Windows正常交互。

解决方案1 ​​

问题是,如果我只是在整个屏幕上创建一个TopMost窗口,则用户将无法与此窗口下方的任何内容进行交互。

解决方案2

简单地绘制桌面缓冲区也无法解决问题。移动窗户时会产生令人讨厌的效果,同时也会产生沉重的运动模糊效果。这永远不会好看。

解决方案3

在C#中无法挂钩“桌面绘制事件”,因为我必须将一个DLL注入explorer.exe。这根本不是一个漂亮的解决方案,不适用于C#。此外,反病毒程序可能会将其视为有害的东西。


我看到的最接近的是this,但用户将无法“点击”叠加层。在该示例中,叠加层大部分是完全透明的。使用透明度键以外的颜色将导致解决方案1 ​​的问题。

问题:如何有效地覆盖整个屏幕效果?

1 个答案:

答案 0 :(得分:0)

UNTESTED

听起来你的问题就是点击。为了通过你的鼠标消息,你是否考虑过截取你的顶部窗口上的鼠标点击(假设这被设置为透明窗口),然后隐藏你的窗口,使用user32 import 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;
    }
}

您可以使表单本身在较新的窗体中透明,如:

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();

您首先需要隐藏表单,这样可能会导致闪烁。