C# 桌面上的全屏覆盖

C# 桌面上的全屏覆盖,c#,.net,drawing,C#,.net,Drawing,我试图在整个屏幕上创建一个全屏覆盖,这将改变整个屏幕的颜色/饱和度等,并添加一些文本和效果。基本上,我想“替换”整个屏幕,而用户仍然能够与Windows正常交互 解决方案1 然而,问题是,如果我只是在整个屏幕上创建一个最上面的窗口,用户将无法与该窗口下面的任何内容进行交互 解决方案2 简单地在桌面缓冲区上绘图也不能解决这个问题。当窗口移动时,它会产生令人讨厌的效果,也会导致严重的运动模糊效果。这看起来永远不会好 解决方案3 在C#中无法挂接“桌面绘制事件”,因为我必须将DLL注入explorer

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

解决方案1

然而,问题是,如果我只是在整个屏幕上创建一个
最上面的
窗口,用户将无法与该窗口下面的任何内容进行交互

解决方案2

简单地在桌面缓冲区上绘图也不能解决这个问题。当窗口移动时,它会产生令人讨厌的效果,也会导致严重的运动模糊效果。这看起来永远不会好

解决方案3

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


我看到的最接近的东西是,但是用户将无法“点击”覆盖。在本例中,覆盖大部分是完全透明的。使用透明键以外的颜色将导致解决方案1出现问题

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

未经测试

听起来你的问题是点击。为了传递鼠标消息,您是否考虑过截取顶部窗口上的鼠标单击(假设此窗口已设置为透明窗口),然后隐藏窗口,使用user32 import SendMessage触发相同的鼠标消息,然后再次显示窗口?如果不想隐藏窗口,可以直接调用SendMessage到其他各种窗口句柄

以下链接显示了如何在应用程序桌面上的窗口间循环:

我认为,如果已经使表单透明,也可以重写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属性。这可以让顶部窗体对鼠标事件透明。这是一个非常好的主意!我看到的唯一缺点是它会导致运动模糊效果。看,我把屏幕上的图像复制到表单上。表单将不透明,因此我们只能看到表单上的内容。那么,如果我们看到我们的“假”图像(表单),我如何复制桌面图像?基本上我们需要做的就是复制屏幕内容,而不复制覆盖表单。这可能吗?嗯,它仍然会导致运动模糊和一些质量损失。如果要创建颜色反转效果,该怎么办?在这种情况下,
不透明度
将不起作用。实际上,我希望表单具有
透明度
1
,这样我就可以完全选择应该显示的内容,而不需要运动模糊。是否有可能隐藏表单、捕获屏幕并在不闪烁/延迟的情况下重新显示?我试过了,但没有找到解决办法。