rysowanie na ekranie bez formy

Czy możliwe jest stworzenie dużego białego prostokąta na ekranie za pomocą konsoli C#, a nie aplikacji C# Forms?

Powinien pokryć cały ekran, jeśli to możliwe. Wiem, że muszę użyć systemu.Rysowanie i próbowałem kilku kroków, ale żaden nie wydrukuje niczego na moim ekranie!

Author: Benjamin, 2013-01-17

3 answers

Metoda 1: wywołanie Windows API

Potrzebujesz System.Drawing i System.Runtime.InteropServices. Może być konieczne dodanie do nich odniesień do projektów.

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

Dodaj metody do swojej klasy za pomocą P / Invoke

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

Pobierz Graphics obiekt dla całego ekranu i narysuj nim prostokąt:

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

Problem z tą metodą polega na tym, że jeśli ekran się odświeży, prostokąt zostanie nadpisany, co czyni go bezużytecznym dla większości praktycznych zastosowań.

Metoda 2: Tworzenie obramowania formularz

Jak poprzednio, potrzebujesz referencji do projektu. Tym razem do System.Windows.Forms. Będziesz również potrzebował System.Drawing Ponownie:

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

Utwórz nowy formularz, usuń jego obramowania, wypełnij nim ekran i umieść go na pasku zadań:

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

Możliwy problem polega na tym, że użytkownik może po prostu alt + tab od okna. Jeśli chcesz wykonać bardziej skomplikowaną grafikę, musisz napisać kod rysunkowy, taki jak this . Aby tło formularza było przezroczyste, ustaw jego TransparentKey do tego samego co jego Backolor.

Właśnie przetestowałem oba w. NET 4.5 i Windows 7, więc może być inaczej dla wcześniejszych wersji. Więcej informacji tutaj i tutaj .

 44
Author: Tharwen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:47

Tak, można rysować na ekranie, ale może być łatwiejsze użycie najwyższego, bezramkowego formularza.

Możesz to również zrobić z aplikacji konsolowej, jeśli musisz, pod warunkiem, że odwołasz się do niezbędnych zestawów, ale spowoduje to, że okno konsoli pozostanie na ekranie przez cały okres użytkowania aplikacji.

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

Alternatywnie wierzę, że możesz utworzyć instancję Window i wywołać Show na tym.

Ta odpowiedź na inne pytanie wyjaśnia, jak użyj wywołań GDI+, aby rysować bezpośrednio na ekranie.

 5
Author: Paul Ruane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:47

Sposób, w jaki Rozumiem pytanie, to nie jest tak naprawdę możliwe w żaden znaczący sposób. Przypuszczam, że można by powołać się na user32.dll i gdi32.dll i zaimplementować klasyczną aplikację Windows UI w ten sposób, z pętlą wiadomości, i tak dalej, ale byłoby o wiele prostsze po prostu używać formularzy. Dlaczego nie możesz tego zrobić?

 1
Author: 500 - Internal Server Error,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-17 18:46:34