Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Vytvoření spořiče obrazovky
8. března 2001, 00.00 | Jak vytvořit spořič obrazovky pro Windows v C++ s použitím programovacího prostředí Borland C++ Builder? Důkladný popis s ukázkami najdete v tomto článku!
Spořič obrazovky (soubory *.scr) ve Windows je klasická Win32 spustitelná aplikace s tím, že soubor spořiče má koncovku .scr a musí být umístěn v příslušné systémové složce - ve Windows 2000 je to podsložka "system32" složky, v které jsou Windows 2000 nainstalovány, obvykle tedy WINNT, ve Windows 98 a Me je to pak podsložka "system" složky instalace Windows. Pokud umístíme naši aplikaci do této složky a dáme jí příponu scr, objeví se nám název souboru aplikace v seznamu spořičů obrazovky v nastavení vlastností obrazovky (což jistě znáte).
Jakým způsobem je spořič spouštěn? Spořič může být spuštěn v různých
režimech, což řídí systém Windows a podle požadovaného
režimu spustí aplikaci s příslušným parametrem příkazové řádky (před parametrem by mohlo být /, - a může být malým nebo velkým
písmenem):
- c nebo bez parametru - je požadován konfigurační dialog (uživatel stiskl tlačítko "nastavení")
- s, l - je požadováno spuštění spořiče v "normálním" režimu
- p - požadován "náhled", dalším parametrem pak může být handle na okno "malé obrazovky" v konfiguračním dialogu, v kterém má být zobrazena "miniatura" spořiče.
- a - parametr použitý pouze ve Windows 95 s balíkem Plus!, má se vyvolat vlastní dialog nastavení hesla, druhým parametrem je pak handle rodičovského okna tohoto dialogu
Dalším specifikem spořiče je ukončení jeho běhu po detekci aktivity uživatele, tj. stisknutím klávesnice nebo nějaké akce myši. Navíc v řadě Windows 95 - Me by měl spořič před svým ukončením otestovat správné zadání hesla, samozřejmě pokud je toto nastaveno ve vlastnostech zobrazení v ovládacích panelech. S tím souvisí (v případě nastavení hesla) zablokování ukončení aplikace pomocí systémového příkazu. To znamená zakázat např. klávesové kombinace Ctrl-TAB, Ctrl-Alt apod.
Ukážeme si na jednoduchém příkladě realizaci těchto kroků, s tím, že jedinou činností spořiče bude vypsání textu uprostřed formuláře. Vytvoření vlastních efektů již spadá pod jiné téma programování, kde se vlastní kreativitě meze nekladou. Pro vytvoření aplikace lze samozřejmě použít jakýkoli vývojový nástroj pro Windows. Já zde použiji C++ Builder s využitím VCl knihovny pro vytvoření okna spořiče. Aplikaci jsem vytvořil pomocí "New - Console Wizard", budeme tedy mít vygenerovanou pouze "klasickou" funkci WinMain. Dále jsem do projektu přidal dva formuláře, TFRun a TFConfig. Formulář FRun bude použit pro spuštění spořiče v normálním režimu a FConfig bude sloužit pro nastavení parametrů spořiče po vyvolání volby nastavení z ovládacích panelů - vlastnosti obrazovky.
Nejdříve musíme zjistit režim, v kterém je spořič aktuálně spuštěn, pomocí analýzy příkazového řádku. Mohl bych samozřejmě použít ParamStr z VCL, ale pro větší univerzálnost kódu v jiných prostředích (Visual C++ ...), jsem použil API funkce GetCommandLine.
|
Když máme takto zjištěný režim spořiče, do funkce WinMain můžeme přidat přepínač
|
Left = 0;
Top = 0;
Width = GetSystemMetrics(SM_CXSCREEN);
Height = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
Nyní musíme zajistit správné ukončování běhu spořiče po detekci činnosti uživatele. Musíme proto nějakým způsobem zachytávat příslušné zprávy Windows a podle toho ukončit běh spořiče. V případě běhu pod Windows řady 95 - Me musíme dále otestovat, zda v případě, že je nastavena ochrana spořiče heslem, bylo před ukončením spořiče zadáno správné heslo.
Zachytávání zpráv v C++ Builderu můžeme řešit různými způsoby. Bylo by možné vytvořit mapu zpráv pomocí maker BEGIN_MESSAGE_MAP a END_MESSAGE_MAP s příslušnými handlery. V našem případě je jednodušší vytvořit vlastní proceduru okna, na kterou přesměrujeme proceduru okna našeho formuláře. Já jsem použil funkci CreateWindowHandle, v které po zavolání této metody předka (TForm) máme možnost doplnit vlastní kód okamžitě po vytvoření platného handle okna formuláře. Obecně pokud chceme některý kód provést "co nejdříve" po vytvoření handle okna formuláře, nejvhodnější je právě tato funkce. Proto jsem také právě zde umístil výše zmíněnou funkci SetWindowPos, dále zjištění výchozí polohy kurzoru myši (pro pozdější detekci pohybu myši), skrytí kurzoru (funkce ShowCursor(false)) a zmíněné přesměrování procedury okna. Kód této funkce a nové procedury okna formuláře může pak vypadat třeba takto:
|
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, &ui, 0);
Druhý parametr (1) zakazuje systémové klávesové kombinace jako Alt-TAB a podobně. Tím znemožníme obejít (v řadě Win95) ochranu heslem přepnutím do jiné aplikace.
Podívejme se na kód funkce, která realizuje ochranu heslem ve Windows řady 95:
|
Do kódu formuláře FRun musíme ještě přidat, nejlépe v události OnClose (tj. při zavření formuláře a tedy následném ukončení programu, kód, který opět zobrazí kurzor a povolí systémové klávesy, které jsem při spuštění zakázali:
void __fastcall TFRun::FormClose(TObject *Sender, TCloseAction &Action)
{
ShowCursor(true);
UINT ui;
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, &ui, 0);
}
Samozřejmě že bychom mohli do této události (OnClose) také přemístit kód funkce
VerifyPassword a pomocí parametru Action pak zakázat nebo povolit zavření formuláře.
Podobných variant umístění kódu by se samozřejmě našlo více. Zde však jde o to ukázat
princip tvorby spořiče obrazovky a konkrétní realizace je již věcí "rukopisu" každého
programátora.
Když se podíváte do kódu přiloženého ukázkového příkladu, v modulu SaverMain.cpp najdete ještě funkci, pro zjištění handle okna pro náhled spořiče. Jedná se malou "obrazovku" v dialogu nastavení vlastností spořiče obrazovky, v které většina spořičů (i když to v zásadě není nutné), zobrazuje svůj náhled. V tomto příkladě jsem se nezabýval konkrétní realizací tohoto náhledu. Šlo by v podstatě o to, spustit okno aplikace jako "dětské okno" tohoto okna, jehož handle získáme.
Poslední věcí, o které se zde zmíním, je použití mutexu ve funkci WinMain, kterým zjišťuji, zda již běží jedna instance tohoto spořiče, abych zabránil vícenásobnému spuštění, ke kterému by pravděpodobně docházelo v pravidelných intervalech daných nastavenou časovou prodlevou spořiče. K tomu ještě poznamenám, že ve Windows 98 a vyšších a Windows 2000 a vyšších lze zjistit, zda běží nějaký spořič pomocí již zmíněné funkce SystemParametersInfo s použitím parametru SPI_GETSCREENSAVERRUNNING (podrobnosti jistě najdete v dokumentaci).
Zde si můžete stáhnout ukázkový projekt
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007