2010-05-25 19 views
13

Quiero dibujar directamente en el escritorio en C#. Después de buscar un poco, terminé usando un objeto Graphics del Desktop HDC (nulo). Luego, pinté normalmente usando este objeto Graphics.¿Cómo dibujar efectivamente en el escritorio en C#?

El problema es que mis formas se pierden cuando se vuelve a dibujar cualquier parte de la pantalla. Probé un ciclo While, pero en realidad termina dibujando tan rápido como la aplicación puede, que no es la tasa de actualización del escritorio.

Normalmente, tendría que poner mi código de dibujo en un evento "OnPaint", pero tal cosa no existe para el escritorio.

¿Cómo lo haría?

código Ejemplo: https://stackoverflow.com/questions/1536141/how-to-draw-directly-on-the-windows-desktop-c

+0

¿Qué versión de Windows? – SLaks

Respuesta

8

Cuando dibuja a HDC (NULO) dibuja en la pantalla, de una manera no administrada. Como ha descubierto, tan pronto como Windows actualiza esa parte de la pantalla, sus cambios se sobrescriben.

Hay un par de opciones, dependiendo de lo que quiere lograr:

  1. crear un sin bordes, posiblemente ventana no rectangular. (Use SetWindowRgn para hacer que una ventana no sea rectangular). Puede hacer que sea una ventana secundaria de escritorio.
  2. subclase de la ventana del escritorio. Esto no es sencillo e involucra inyectando una DLL en el proceso Explorer.exe.
1

Esto es difícil de hacer correctamente.

Será mucho más fácil y más confiable crear su propia forma sin bordes.

3

Para tener una OnPaint para el escritorio que tendría que subclase de la ventana del escritorio y el uso de la lógica de dibujo cuando se recibe un mensaje WM_PAINT/WM_ERASEBKGND.

Como dice el hilo al que vinculó, solo puede interceptar los mensajes enviados a una ventana de un proceso externo utilizando un enlace (SetWindowsHookEx desde una DLL).

Como se mencionó, una ventana transparente es otra forma de hacerlo, o (según la frecuencia de actualización) copiar, dibujar y establecer un fondo de pantalla temporal (como bginfo).

15

I publicado dos soluciones para un requisito similar here

Básicamente, usted tiene dos opciones.

1- Obtenga un objeto de gráficos para el escritorio y comience a dibujar en él. El problema es que si usted necesita para comenzar a despejar lo que ha dibujado previamente etc.

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); 
} 

2- La segunda opción que proporciono en el enlace anterior es la creación de un top-mayoría de la ventana transparente y hacer todo el dibujo en esa ventana. Esto básicamente proporciona una superposición transparente para el escritorio que puede dibujar. Una posible desventaja de esto, como menciono en la respuesta original, es que otras ventanas que también son de primerísima calidad y que se crean después de que se inicie la aplicación oscurecerán su ventana superior. Esto se puede resolver si es un problema.

Para la opción 2, hacer que el formulario sea transparente es tan simple como usar una clave de transparencia, esto permite que los clics del mouse, etc. caigan al escritorio subyacente.

BackColor = Color.LightGreen; 
TransparencyKey = Color.LightGreen; 
+0

¿Presumiblemente esto * no * funcionaría para aplicaciones de pantalla completa (juegos, etc.)? – acron

+2

Uno debe pasar GetDesktopWindow() a Graphics.FromHwnd() porque IntPtr.Zero es un detalle de implementación que puede cambiar, y sin duda ** NO ** funcionará para estaciones de trabajo de varios escritorios o sesiones múltiples. –

Cuestiones relacionadas