Wygaszacz ekranu w C#

Wygaszacz ekranu w C#

Autor: Marcin Hałaczkiewicz

Opublikowano: 6/8/2006, 12:00 AM

Liczba odsłon: 60888

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.

Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży
Jak wykorzystać Copilot w codziennej pracy? Kurs w przedsprzedaży

Wydarzenia