UWAGA! Promocja dla firm - MICROSOFT OFFICE 365  na 12 miesiecy ZA DARMO! Tylko na CentrumXP.pl!
Wielka promocja Office 365 na CentrumXP.pl!
Do góry Skomentuj

Wygaszacz ekranu w C#

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.

Zobacz również

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

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.

Autor:

Komentarz:

Dodaj komentarz