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!
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 .
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.
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ć?
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