【问题标题】:Fullscreen overlay over desktop桌面上的全屏覆盖
【发布时间】:2013-07-19 17:03:58
【问题描述】:

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

解决方案 1

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

解决方案 2

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

解决方案 3

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


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

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

【问题讨论】:

  • 我很想知道这是否可能。我的一切都说绝对不是

标签: c# .net drawing


【解决方案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();

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

【讨论】:

  • 我认为 windows 窗体有一个可以覆盖的 CreateParams 属性。这可能会让顶部表单对鼠标事件透明。
  • 这真是个好主意!我看到的唯一缺点是它会导致运动模糊效果。看,我将图像从屏幕复制到表单上。表格不会是透明的,所以我们只能看到表格上的内容。那么如果我们看到我们的“假”图像(表单),我该如何复制桌面图像?
  • 基本上我们需要做的就是复制没有覆盖表单的屏幕内容。这有可能吗?
  • 好吧,它仍然会导致运动模糊和一些质量损失。如果我想创建颜色反转效果怎么办?在这种情况下,Opacity 将不起作用。我实际上希望表单具有1Opacity,这样我就可以完全选择应该显示的内容,而不会出现运动模糊。是否有可能隐藏表单,捕获屏幕并重新显示它而不会闪烁/滞后?我试过了,但没有找到解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多