¿Cómo dibujar directamente en el escritorio de Windows, C #?

Esta pregunta ha sido solicitada para otros idiomas, e incluso para esos otros idiomas, he encontrado que sus respuestas carecen de la forma exacta de hacerlo, de forma limpia (sin repintar las pantallas, etc.).

¿Es posible dibujar en el escritorio de Windows desde C #? Estoy buscando un ejemplo si es posible.

Pruebe lo siguiente:

using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.InteropServices; class Program { [DllImport("User32.dll")] static extern IntPtr GetDC(IntPtr hwnd); [DllImport("User32.dll")] static extern int ReleaseDC(IntPtr hwnd, IntPtr dc); static void Main(string[] args) { IntPtr desktop = GetDC(IntPtr.Zero); using (Graphics g = Graphics.FromHdc(desktop)) { g.FillRectangle(Brushes.Red, 0, 0, 100, 100); } ReleaseDC(IntPtr.Zero, desktop); } } 

Puedes probar:

 Graphics.FromHwnd(IntPtr.Zero) 

Puede ver un ejemplo de código de mundo real en https://uiautomationverify.codeplex.com/SourceControl/latest#UIAVerify/Tools/visualuiverify/utils/screenrectangle.cs

Esto dibuja un rectángulo que aparecerá en la pantalla hasta que el usuario elija eliminarlo en una posición arbitraria (no se volverá a pintar). Utiliza una forma de Windows que está oculta / aparece como una ventana emergente.

Este es el código detrás de la herramienta UIAVerify.exe en el SDK de Windows actual.

Si desea utilizar lo anterior, copie los siguientes archivos en su proyecto:

  • utils\screenboundingrectangle.cs
  • utils\screenrectangle.cs
  • win32\*

Puede que necesite actualizar espacios de nombres en consecuencia + agregar referencias a System.Drawing + System.Windows.Forms

Luego puedes dibujar un rectángulo con el siguiente código:

 namespace Something { public class Highlighter { ScreenBoundingRectangle _rectangle = new ScreenBoundingRectangle(); public void DrawRectangle(Rectangle rect) { _rectangle.Color = System.Drawing.Color.Red; _rectangle.Opacity = 0.8; _rectangle.Location = rect; this._rectangle.Visible = true; } } } 

y

 var rect = Rectangle.FromLTRB(100, 100, 100, 100); var hi = new Highlighter(); hi.DrawRectangle(rect);