如何在C#中有效地绘制桌面?

我想直接在C#中的桌面上绘制。 从search一下,我最终使用桌面HDC的一个graphics对象(空)。 然后,我通常使用这个Graphics对象绘制。

问题是当屏幕的任何部分被重新绘制时,我的形状会丢失。 我尝试了一个While循环,但实际上最终的绘制速度与应用程序的速度一样快,而不是桌面的更新速度。

通常情况下,我需要将我的绘图代码放在“OnPaint”事件中,但桌面上不存在这样的事情。

我该怎么做?

示例代码: https : //stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c

当您绘制到HDC(NULL)时,以非托pipe方式绘制到屏幕。 正如你所发现的那样,只要windows刷新屏幕的那一部分,你的改变就会被覆盖。

有几个选项,取决于你想达到什么:

  1. 创build一个无边界的,可能是非矩形的窗口。 (使用SetWindowRgn使一个窗口非矩形。)您可以将其设置为桌面窗口的子窗口。
  2. 子类桌面窗口。 这不是直截了当的,并涉及到一个DLL注入Explorer.exe进程。

我在这里发布了两个类似的需求解决scheme

基本上你有两个select。

1-获取桌面的graphics对象并开始绘制。 问题是如果你需要开始清理你以前画的东西等

Point pt = Cursor.Position; // Get the mouse cursor in screen coordinates using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) { g.DrawEllipse(Pens.Black, pt.X - 10, pt.Y - 10, 20, 20); } 

我在上面的链接中提供的第二个选项是创build一个透明的最顶层窗口,并在窗口中进行所有的绘图。 这基本上为您可以绘制的桌面提供了一个透明的覆盖。 正如我在最初的答案中提到的那样,一个可能的缺点就是其他窗口也是最顶级的,并且是在您的应用程序启动后创build的,将会掩盖您最上层的窗口。 这可以解决,如果这是一个问题,但。

对于选项2,使表单透明与使用透明键一样简单,这允许鼠标点击等通过底层桌面。

 BackColor = Color.LightGreen; TransparencyKey = Color.LightGreen; 

要获取桌面的OnPaint ,您需要在桌面窗口的子类中创buildWM_PAINT/WM_ERASEBKGND消息,并使用绘图逻辑。

正如您所链接的线程所说,您只能使用钩子(来自DLL的SetWindowsHookEx )拦截发送到外部进程窗口的消息。

如上所述,透明窗口是另一种方式,或者(取决于更新频率)复制,绘制和设置临时壁纸(如bginfo所做的那样)。

这很难做到正确。

制作自己的无边界forms将会变得更容易,更可靠。