Wygaszacz ekranu w C#
Autor:
Marcin Hałaczkiewicz
Opublikowano:
8 czerwca 2006
Odsłon:
45 602
Dzisiaj zajmiemy się prostym wygaszaczem ekranu. Program będzie się składał z
formy bez obramowania i paska u samej góry (tego z przyciskiem do zamknięcia).
Zmaksymalizowana forma zajmie cały ekran. Na niej będziemy wyświetlać co
jakiś czas zdjęcia umieszczone w katalogu :, który musi znajdować się w
folderze z programem. Po ruszeniu myszką, naciśnięciu klawisza lub przycisku
myszki - wygaszacz się wyłączy.
Zaczynamy od stworzenia nowego projektu, nazywamy go wygaszacz. Taką
samą nazwę z przedrostkiem frm nadajemy automatycznie utworzonej formie.
Zmieniamy w niej również BackgroundImageLayout na Stretch. Dzięki
temu obrazek w tle formatki będzie rozciągnięty. Aby pozbawić okno programu
obramowania, a przede wszystkim górnego paska, ustawiamy pole FormBorderStyle
na None. Chcielibyśmy, aby aplikacja uruchamiała się zminimalizowana
(dlaczego - o tym zaraz), więc zmieniamy WindowState na Minimized.
Jeszcze tylko ulepszone odświeżanie grafiki dzięki zmianie DoubleBuffered
na True i forma jest przygotowana. Potrzebujemy teraz kontrolki
Timer, która będzie zmieniać zdjęcie w tle co jakiś czas. Tworzymy ją,
nazywamy licznik i przestawiamy Interval na np. 3000 (3 sekundy).
Zajmijmy się teraz właściwym pisaniem kodu.

Przechodzimy do widoku kodu formatki. Aby możliwe było korzystanie z klas do obsługi operacji na plikach/katalogach
na samej górze dopisujemy:
using System.IO;
Następnie odajemy do formy następujące zmienne:
int x, y; - pozycja kursora w momencie uruchomienia programu
string[] pliki; - nazwy plików z katalogu "obrazki"
int n = 0; - liczba plików w katalogu "obrazki"
int nr_obrazka = 0; - nr aktualnie wyświetlanego obrazka
Następnie utwórzmy obsługę zdarzenia FormLoad dla naszej formy. We
wnętrzu funkcji wpisujemy:
bool jakikolwiek = false;
x = Cursor.Position.X;
y = Cursor.Position.Y;
string dir = Application.StartupPath + "\\obrazki";
try
{
pliki =
Directory.GetFiles(dir);
}
catch
{
MessageBox.Show("W folderze z
programem\n" +
"musi
znajdować się katalog \"obrazki\",\n" +
"zawierający
obrazki do wyświetlania.", "Błąd",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
n = pliki.Length;
if (n == 0)
{
MessageBox.Show("Brak plików w katalogu", "Błąd", MessageBoxButtons.OK,
MessageBoxIcon.Error);
Application.Exit();
}
do
{
try
{
BackgroundImage =
Image.FromFile(pliki[nr_obrazka++]);
jakikolwiek
= true;
break;
}
catch { }
} while (nr_obrazka <
n);
if (!jakikolwiek)
{
MessageBox.Show("Katalog nie zawiera
plików graficznych.", "Błąd",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
Cursor.Hide();
this.WindowState = FormWindowState.Maximized;
licznik.Start();
Na początku zapamiętujemy pozycję kursora w momencie startu programu,
przyda nam się to przy próbie wykrycia ruchu myszką. W zmiennej dir
zapisujemy ścieżkę do katalogu "obrazki". Jeśli katalog nie istnieje,
wyświetlamy odpowiedni komunikat i kończymy aplikację. Podobnie postępujemy, gdy
podany folder jest pusty. Następnie próbujemy otworzyć dowolny plik z "obrazki"
i wyświetlić go. Jeśli z żadnym nam się nie powiedzie zamykamy program oraz
pokazujemy stosowny komunikat. Jeśli nie wystąpi błąd w czasie sprawdzenia tych
warunków ukrywamy
kursor, maksymalizujemy formę i uruchamiamy licznik. Formatka została
zmaksymalizowana dopiero teraz, aby w razie błędu nie był on wyświetlany na
zasłaniającej cały pulpit szarości.
Obsłużmy teraz zdarzenie Tick dla licznik. Klikamy na nim w
graficznym edytorze dwa razy i wewnątrz nowo utworzonej funkcji wpisujemy:
if (nr_obrazka >= n)
{
nr_obrazka = 0;
}
do
{
try
{
BackgroundImage = Image.FromFile(pliki[nr_obrazka++]);
break;
}
catch
{
if (nr_obrazka == n - 1)
{
nr_obrazka = 0;
break;
}
}
} while (nr_obrazka < n);
Zadaniem tej funkcji jest pokazanie kolejnego obrazka z katalogu "obrazki", przy czym pliki, w nieobsługiwanych formatach będą pominięte. Ponadto jeśli wszystkie
dostępne zdjęcia zostaną już wyświetlone, cały proces rozpocznie się od
początku.
Nasz wygaszacz jest już prawie gotowy. Wprawdzie działa, ale nie można go
wyłączyć. Chcielibyśmy, aby zachowywał się jak prawdziwy screensaver czyli
kończył swoje działanie po ruszeniu myszką lub naciśnięciu klawisza. Aby uzyskać
ten efekt dodajemy do formy 3 zdarzenia. KeyDown, MouseClick i
MouseMove. W treści pierwszych dwóch wpisujemy Application.Exit();
co zakończy działanie aplikacji. Dla ruchu myszki sprawdzimy jeszcze czy jej
położenie zmieniło się od czasu uruchomienia programu. Jeśli tak to również
zakończymy program:
if (e.X != x || e.Y != y)
Application.Exit();
I tak oto ukończyliśmy pisanie naszej aplikacji. Jeśli chcemy, aby stała się
prawdziwym wygaszaczem wystarczy zmienić jej rozszerzenie z exe na scr
i skopiować ją do katalogu Windows\System32, musimy tam również umieścić
folder "obrazki". Teraz możemy już wybrać nasz wygaszacz we właściwościach
ekranu. Jedyny mankament po tej operacji jest taki, że po kliknięciu OK lub Zastosuj
od razu się on uruchomi. Nie będę opisywał dlaczego tak się dzieje, gdyż
wykracza to poza ramy tego artykułu. Powiem tylko, że wystarczy ruszyć myszą i
się wyłączy ;)
Stworzony tutaj program wraz z plikami źródłowymi możemy pobrać stąd.
Komentarze
Fajna instrukcja tylko skąd wziąść C#??
www.taex.yoyo.pl,
9 czerwca 2006, 21:04
http://2005express.pl/
Paweł Wujczyk,
9 czerwca 2006, 23:01
Świetny tutorial - opisana prosta obsługa błędów, MessageBox'y i operacje na plikach/katalogach w jednym :) Dopowiem tylko, że w opisie brakuje info o dopisaniu przestrzeni nazw: System.Drawing i System.IO, pierwszego potrzebuje klasa Image, a drugiego Directory. Czekam na więcej! :) p.s. Dołączony kod programu nie ma opisanej obsługi licznika i wyjścia z programu na 3 sposoby ;)
m010ch,
11 czerwca 2006, 01:10
Odwołuje p.s. - moje niedopatrzenie ;)
m010ch,
11 czerwca 2006, 01:11
A po co komou badziewny C# Microsoftu, skoro można używać dużo lepiej opisanego w necie, z darmowymi kompilatorami, szybszego, łatwiejszego C++? Chyba tylko po to, żeby stać się niewolnikiem tej korporacji.
ConrPL,
11 czerwca 2006, 16:47
ConrPL: Sio trollu, o starych technologiach przelewaj swoje wypociny na bzdurnych forach, których w internecie nie brakuje dla takich zakompleksionych typów.
m010ch,
12 czerwca 2006, 10:00
jak się tworzy "obsługę zdarzenia FormLoad"?
anomo,
7 czerwca 2007, 13:26
już wiem o co chodzi,sorki
anomo,
7 czerwca 2007, 13:41
wykorzystajcie darmowe środowisko SharpDevelop 2.2
Dawid,
30 sierpnia 2007, 15:59
Visual studio express też jest darmowy, a do CornPL: c++ wymyślono w latach 70, a C# chyba 2005 zy coś koło tego.
matrix0123456789,
11 września 2007, 20:09
@ConrPL
Nigdy nie programowałeś w C#.....
Apropo C++ (używałem go 3 lata)
1. Jest trudny !!!
2. Podatny na błędy
3. Aplikacje pisze się średnio 10x wolniej niż np w C#
C++ to naprawdę fajny i potężny język jednak ...nie nadaje się do projektowania aplikacji okienkowych nowego typu.
Nie można wymyślać koła za każdym razem gdy buduje się nowy pojazd a tak programuje się w C++.
Adrian ,
4 października 2007, 20:20
Prosty i fajny projekt!
Astaz3l,
13 grudnia 2007, 14:21
Jakimiś głupotami sie zajmujecie :/ powiedzcie mi jak wypełnić progressbar np w ciągu 10 sekund ? bo kurde jakieś intervale ustawiam na 5000 i nic, wszystko działa w mgnieniu oka a chce żeby progressbar zapełnił się do 100 na niebiesko ale w ciągu tych 10 sekund po naciśnięciu przycisku.
co mi po milisekundach ? tylko zaśmiecają zrozumienie programowania:/
Będę wdzięczny za pomoc.
wyzyna.troli@poczta.fm
Trolek,
13 stycznia 2008, 02:04
Acha tak dla jasności pisze w C# VS 2005
Trolek,
13 stycznia 2008, 02:05
Takie nijakie, ale jak ktoś dopiero zaczyna "bawić się" C#, to jeszcze jako tako ujdzie. Przede wszystkim mało kto będzie robił taki wygaszacz bo nie jest zbyt praktyczny.
Sebek,
20 stycznia 2008, 07:47
kto zna proste otwieranie i zamykanie portu COM1?
Proste czytanie znaków z portu do pliku i na ekran formularza...
Proste wysyłanie stringu kilku znaków do portu szeregowego...
a.Visual Studio .net 2003
b.VS2005 Express version
c.VS2008 Professional (student licence)
rs232c,
11 września 2009, 04:47
Z całym szacunkiem ale C++ to stary shit
Xardas,
24 października 2009, 18:33
Czyli co jest lepsze? C# czy C++???

Bo ja niewiem a dopiero zaczynam pracę...
Kościak,
25 listopada 2009, 14:22
NIE MA(!) lepszego języka wysokopoziomowego niż C++ (jeśli się mylę, to mnie poprawcie)! Jednak, początkującym polecam C#, a potem przejście na C++. Przy użyciu standardowych bibliotek, C++ staje się łatwiutkie! Ale przy okienkach, polecam C#.
kamcio1,
25 grudnia 2011, 21:56