C# 如何用透明颜色填充桌面?

C# 如何用透明颜色填充桌面?,c#,winforms,winapi,C#,Winforms,Winapi,我用这个代码用颜色填充桌面 IntPtr desktop = GetDC(IntPtr.Zero); Graphics g = Graphics.FromHdc(desktop); g.FillRectangle(new SolidBrush(Color.FromArgb(60, 255, 0, 0), Screen.PrimaryScreen.Bounds); ReleaseDC(IntPtr.Zero, desktop); 这很好,但速度很慢。 如果我用不透明的颜色填充桌面,从

我用这个代码用颜色填充桌面

IntPtr desktop = GetDC(IntPtr.Zero);
Graphics g = Graphics.FromHdc(desktop);
g.FillRectangle(new SolidBrush(Color.FromArgb(60, 255, 0, 0), Screen.PrimaryScreen.Bounds);      
ReleaseDC(IntPtr.Zero, desktop);
这很好,但速度很慢。 如果我用不透明的颜色填充桌面,从argb(255,255,0,0)可以非常快地工作。 如何提高透明彩色绘图的速度?

GDI+(System.drawing使用的)全部在软件中实现,其速度并不为人所知

你最好用另一种方式解决你的问题。尝试创建一个BorderStyle=None的表单,调整其大小以填充整个屏幕,并将其背景色设置为红色,不透明度设置为0.25(接近您的alpha=60)。

GDI+(这是System.Drawing使用的)全部由软件实现,其速度不为人所知


你最好用另一种方式解决你的问题。尝试创建一个BorderStyle=None的表单,调整其大小以填充整个屏幕,并将其背景色设置为红色,不透明度设置为0.25(接近alpha=60)。

使用GDI+执行任何涉及完全透明度的操作都会非常慢。这是因为透明度涉及大量乘法和除法来混合像素颜色,而绘制不透明颜色只是覆盖旧像素的问题。它需要更多的处理器

乔·怀特的方法是一个很好的选择。拥有一个背景色和低不透明度的最大化表单会很好,而且速度会快得多。但是请记住,使用表单还需要担心一些其他问题:

  • 表单将阻止单击桌面图标
  • 用户可以将表单最小化,去掉红色-即使它不在任务栏中,windows key+D也会将其最小化(当然,只需编写代码即可再次显示表单)
  • 该表单可能最终位于其他表单的顶部,使其呈现红色(您可以将表单设置为 但低于所有其他表单,这将解决此问题)
它没有那么慢,但是当使用表单而不是直接在桌面上绘制时,还有其他一些事情需要担心

这实际上取决于您为什么要将桌面染成红色-根据您试图实现的目标,可能还有其他更简单的方法:

  • 您可以将桌面壁纸染成红色-这不会影响图标,但不会有任何性能问题
  • 如果你不关心桌面交互,你可以截图,把它染成红色,然后以最大化的形式显示出来
  • 如果您认为不需要经常重新绘制,那么您当前的方法就可以了

另外,不要忘记有些人有多个监视器设置。如果您想涵盖所有内容,您需要为每个监视器创建一个表单。

使用GDI+做任何涉及完全透明的事情都会非常慢。这是因为透明度涉及大量乘法和除法来混合像素颜色,而绘制不透明颜色只是覆盖旧像素的问题。它需要更多的处理器

乔·怀特的方法是一个很好的选择。拥有一个背景色和低不透明度的最大化表单会很好,而且速度会快得多。但是请记住,使用表单还需要担心一些其他问题:

  • 表单将阻止单击桌面图标
  • 用户可以将表单最小化,去掉红色-即使它不在任务栏中,windows key+D也会将其最小化(当然,只需编写代码即可再次显示表单)
  • 该表单可能最终位于其他表单的顶部,使其呈现红色(您可以将表单设置为 但低于所有其他表单,这将解决此问题)
它没有那么慢,但是当使用表单而不是直接在桌面上绘制时,还有其他一些事情需要担心

这实际上取决于您为什么要将桌面染成红色-根据您试图实现的目标,可能还有其他更简单的方法:

  • 您可以将桌面壁纸染成红色-这不会影响图标,但不会有任何性能问题
  • 如果你不关心桌面交互,你可以截图,把它染成红色,然后以最大化的形式显示出来
  • 如果您认为不需要经常重新绘制,那么您当前的方法就可以了

另外,不要忘记有些人有多个监视器设置。如果要涵盖所有内容,您需要为每个监视器创建一个表单。

您是在循环中执行的吗?是什么阻止系统再次绘制它?透明颜色?这样就可以看到显示器的内部了?:)你是在循环中执行吗?是什么阻止系统再次绘制它?透明颜色?这样就可以看到显示器的内部了?:)我同意这一点。这比自己画一个圈或者用画笔画要快得多我同意这一点。这将比自己画一个循环或尝试用画笔填充要快得多,因为你不需要每个显示器都有一张表格。如果您手动调整它的大小(而不是最大化它),您可以给它一个覆盖所有显示器的宽度和高度。@乔·怀特:谢谢您指出这一点,忘记了您可以手动调整窗体的大小,使其大于屏幕分辨率。谢谢您的回答。我想创建一个简单的屏幕截图,我决定使用顶部的透明窗口。你不必每个显示器都有一个表单。如果您手动调整它的大小(而不是最大化它),您可以给它一个覆盖所有显示器的宽度和高度。@乔·怀特:谢谢您指出这一点,忘记了您可以手动调整窗体的大小,使其大于屏幕分辨率。谢谢您的回答。我想创建一个简单的屏幕截图,我决定使用顶部的透明窗口。