C# 桌面上的全屏覆盖
我试图在整个屏幕上创建一个全屏覆盖,这将改变整个屏幕的颜色/饱和度等,并添加一些文本和效果。基本上,我想“替换”整个屏幕,而用户仍然能够与Windows正常交互 解决方案1 然而,问题是,如果我只是在整个屏幕上创建一个C# 桌面上的全屏覆盖,c#,.net,drawing,C#,.net,Drawing,我试图在整个屏幕上创建一个全屏覆盖,这将改变整个屏幕的颜色/饱和度等,并添加一些文本和效果。基本上,我想“替换”整个屏幕,而用户仍然能够与Windows正常交互 解决方案1 然而,问题是,如果我只是在整个屏幕上创建一个最上面的窗口,用户将无法与该窗口下面的任何内容进行交互 解决方案2 简单地在桌面缓冲区上绘图也不能解决这个问题。当窗口移动时,它会产生令人讨厌的效果,也会导致严重的运动模糊效果。这看起来永远不会好 解决方案3 在C#中无法挂接“桌面绘制事件”,因为我必须将DLL注入explorer
最上面的
窗口,用户将无法与该窗口下面的任何内容进行交互
解决方案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
,这样我就可以完全选择应该显示的内容,而不需要运动模糊。是否有可能隐藏表单、捕获屏幕并在不闪烁/延迟的情况下重新显示?我试过了,但没有找到解决办法。