2009-10-08 26 views
14

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.).Cómo dibujar directamente en el escritorio de Windows, C#?

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

+7

No se admite ningún oficialmente manera limpia para dibujar en la ventana del escritorio de cualquier idioma. En la práctica, la mayoría de los métodos que logran el dibujo más cercano al limpio en el escritorio implican inyectar su propia dll en el proceso de Explorer y crear una subclasificación del procedimiento de ventana para la ventana del escritorio. Sin embargo, no recomendaría hacer esto en C#. Además, no hay garantía de que dichos métodos continúen funcionando en futuras versiones de Windows o con futuros service packs o revisiones para las versiones existentes de Windows. –

Respuesta

25

intente 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); 
    } 
} 
+6

Para su información, para aquellos que dicen que no pueden, esto funcionó para mí, aunque al mover cualquier ventana sobre él se vuelve a pintar de inmediato :( – esac

+0

Acabo de probar esto en una aplicación WPF, C# 4.0 y obtengo "PInvokeStackImbalance fue detectado" tan pronto como moví el mouse después de iniciarlo. Solo un FYI para otros que pasan. – Alex

+0

Obtuve el mismo error de pila desequilibrado. ¿Cuál es la solución? ¿Cambia tu proyecto de nuevo a 3.5 perfil de cliente? :) – gonzobrains

8

Usted puede tratar de:

Graphics.FromHwnd(IntPtr.Zero) 
+2

La respuesta de Paolo Tedesco solía funcionar para mí, pero se detuvo y no pude entender por qué. La respuesta de Leppie lo hizo funcionar de nuevo para mí. – chrismead

+0

Parpadea si pongo esto en un temporizador para evitar que el dibujo desaparezca ... – beppe9000

3

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

Esto dibuja un rectángulo que aparecerá en el pantalla hasta que el usuario elija eliminarla 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\*

que necesite actualizar los espacios de nombres en consecuencia + añadir referencias a System.Drawing + System.Windows.Forms

A continuación, se puede 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); 
Cuestiones relacionadas