c# - 全屏覆盖桌面

标签 c# .net drawing

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

解决方案一

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

方案二

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

方案三

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


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

问题:如何高效地在整个屏幕上叠加效果?

最佳答案

未经测试

听起来您的问题很棘手。为了传递您的鼠标消息,您是否考虑过拦截鼠标点击您的顶部窗口(假设这已设置为透明窗口),然后隐藏您的窗口,使用 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;
    }
}

您可以在较新的 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();

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

关于c# - 全屏覆盖桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17751697/

相关文章:

c# - 在属性(property)中回归自己

java - 用Java画对角线

c# - 如何从同一个表中的两个不同列读取数据并在字符串生成器中返回?

c# - 使用 XElement 加载资源文件

c# - 西欧语言的模糊搜索算法(在我的例子中是瑞典语)

java - 为 Android 优化 OpenGL ES 2.0 绘图

qt - 在 QGraphicsView 上绘制一个矩形(或任何东西)

c# - Javascript中获取满足特定条件的数组内的数组

c# - UserManager 的异步方法给出 "Incorrect number of arguments for call to method Boolean Equals"

c# - 多线程中的数学类给出错误