web-dev-qa-db-fra.com

dessiner à l'écran sans forme

Est-il possible de créer un grand rectangle blanc à l'écran en utilisant simplement la console C # et non une application de formulaires C #?

Il devrait couvrir tout l'écran si possible. Je sais que je dois utiliser System.Drawing et j'ai essayé plusieurs étapes, mais aucune n'imprimera rien sur mon écran!

27
user1988147

Méthode 1: appelez l'API Windows

Vous avez besoin System.Drawing et System.Runtime.InteropServices. Vous devrez peut-être leur ajouter des références de projet.

using System.Runtime.InteropServices;
using System.Drawing;

Ajoutez les méthodes à votre classe avec P/Invoke

[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);

Obtenez un objet Graphics pour tout l'écran et dessinez un rectangle avec lui:

IntPtr desktopPtr = GetDC(IntPtr.Zero);
Graphics g = Graphics.FromHdc(desktopPtr);

SolidBrush b = new SolidBrush(Color.White);
g.FillRectangle(b, new Rectangle(0, 0, 1920, 1080));

g.Dispose();
ReleaseDC(IntPtr.Zero, desktopPtr);

Le problème avec cette méthode est que si l'écran est actualisé, le rectangle sera écrasé, le rendant inutile pour la plupart des applications pratiques.

Méthode 2: créer un formulaire sans bordure

Comme précédemment, vous avez besoin d'une référence de projet. Cette fois pour System.Windows.Forms. Vous aurez également besoin de System.Drawing encore:

using System.Drawing;
using System.Windows.Forms;

Créez le nouveau formulaire, supprimez ses bordures, remplissez-le d'écran et placez-le en haut de la barre des tâches:

Form f = new Form();
f.BackColor = Color.White;
f.FormBorderStyle = FormBorderStyle.None;
f.Bounds = Screen.PrimaryScreen.Bounds;
f.TopMost = true;

Application.EnableVisualStyles();
Application.Run(f);

Un problème possible avec cela est que l'utilisateur peut simplement alt + tab loin de la fenêtre. Si vous voulez faire des graphiques plus compliqués, vous devrez écrire du code de dessin comme this . Pour rendre l'arrière-plan du formulaire transparent, définissez son TransparentKey sur le même que son Backolor.

Je viens de tester les deux dans .NET 4.5 et Windows 7, il peut donc être différent pour les versions antérieures. Plus d'informations ici et ici .

54
Tharwen

Oui, il est possible de dessiner à l'écran, mais il peut être plus facile d'utiliser un formulaire sans bordure supérieur.

Vous pouvez également le faire à partir d'une application console, si vous le devez, à condition de référencer les assemblages nécessaires, mais cela entraînerait une fenêtre de console restant à l'écran pendant la durée de vie de l'application.

this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;

Alternativement, je pense que vous pouvez créer une instance de Window et appeler Show à ce sujet.

Cette réponse à une autre question explique comment utiliser les appels GDI + pour dessiner directement à l'écran.

6
Paul Ruane

La façon dont je comprends la question, ce n'est pas vraiment possible de manière significative. Je suppose que vous pouvez invoquer la plate-forme vers user32.dll et gdi32.dll et implémenter une application d'interface utilisateur Windows classique de cette façon, avec une boucle de message, etc., mais il serait beaucoup plus simple d'utiliser simplement des formulaires. Quelle est la raison pour laquelle vous ne pouvez pas faire ça?