Dnešní díl nebude po nějaké době zaměřen na jednu oblast, ale bude se jednat o mix tipů z různých oblastí. Ukážeme si, jak zakázat pohyb formuláře, naučíme se zjišťovat verzi aplikace, pohrajeme si s klávesnicí a také se systémovými zvuky.
Minimalizace a obnovení všech běžících aplikací
Nejprve si ukážeme, jak minimalizovat všechny běžící aplikace. K tomu slouží například známá ikona na panelu rychlého spuštění nebo kombinace kláves "Windows" + M. A této druhé možnosti právě využijeme a v našem příkladu vlastně docílíme požadovaného efektu simulováním stisku těchto kláves. Zde je tedy kód:
procedure TForm1.Button1Click(Sender: TObject);
begin
keybd_event(VK_LWIN, MapVirtualKey(VK_LWIN, 0), 0, 0);
keybd_event(Ord(`M`), MapVirtualKey(Ord(`M`), 0), 0, 0);
keybd_event(Ord(`M`), MapVirtualKey(Ord(`M`), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, MapVirtualKey(VK_LWIN, 0), KEYEVENTF_KEYUP, 0);
end;
A když už jsme se naučili aplikace minimalizovat, proč si neukázat také jejich obnovení. Použijeme obdobný postup jako v prvním příkladu, tentokrát se bude jednat o simulaci stisku kláves "Windows" + Shift + M.
procedure Obnovit;
begin
keybd_event(VK_LWIN, MapVirtualKey(VK_LWIN, 0), 0, 0);
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0);
keybd_event(Ord(`M`), MapVirtualKey(Ord(`M`), 0), 0, 0);
keybd_event(Ord(`M`), MapVirtualKey(Ord(`M`), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, MapVirtualKey(VK_LWIN, 0), KEYEVENTF_KEYUP, 0);
end;
A teď trochu z jiného soudku. Ukážeme si, jak zjistit verzi aplikace. Tento údaj pak můžete použít pro titulkový pruh hlavního formuláře či do okna "O aplikaci". Když bude toto číslo zjišťováno přímo ze souboru a pokud máte u projektu nastaveno automatické zvyšování čísla sestavení (build), nemusíte se již o tento údaj starat a ten bude aktualizován automaticky pomocí naší funkce.
Funkce vrací řetězec čtyř čísel oddělených tečkami, které značí verzi aplikace. Pokud snad není někomu znám přesný význam jednotlivých čísel, zde je stručný popis tak, jak se uvádí v Delphi:
hodnota č. 1 : Major version
hodnota č. 2 : Minor version
hodnota č. 3 : Release
hodnota č. 4 : Build
A zde již slíbená funkce společně s jejím použitím:
function Verze(const Filename: string):string;
var dwHandle: THandle;
dwSize: DWORD;
lpData, lpData2: Pointer;
uiSize: UINT;
begin
Result := ``;
dwSize := GetFileVersionInfoSize(PChar(FileName), dwSize);
if dwSize <> 0 then
begin
GetMem(lpData, dwSize);
if GetFileVersionInfo(PChar(FileName), dwHandle, dwSize, lpData) then
begin
uiSize := Sizeof(TVSFixedFileInfo);
VerQueryValue(lpData, `\`, lpData2, uiSize);
with PVSFixedFileInfo(lpData2)^ do
Result := Format(`%d.%02d.%02d.%02d`, [HiWord(dwProductVersionMS), LoWord(dwProductVersionMS),HiWord(dwProductVersionLS), LoWord(dwProductVersionLS)]);
end;
FreeMem(lpData, dwSize);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(`Verze aplikace: `+ Verze(Application.ExeName));
end;
Zamezení a opětovné povolení pohybu formuláře
Upřímně řečeno přesně netuším, k čemu by se dal přesně využít následující tip, ale to ponechám na vás. Potřebujete-li zkrátka z nějakého důvodu zakázat uživateli pohybovat s oknem aplikace, můžete použít následující krátký kód, který přidáte do události
OnCreate příslušného formuláře:
procedure TForm1.FormCreate(Sender: TObject);
begin
DeleteMenu(GetSystemMenu(Handle, False), SC_MOVE, MF_BYCOMMAND);
end;
Tím se znemožní pohyb formulářem, a to i prostřednictvím systémového menu, neboť je z něj odstraněna položka Přesunout. Pro úplnost se však sluší uvést též kód, který vše vrátí do původního stavu, takže zde je:
procedure TForm1.Button12Click(Sender: TObject);
begin
GetSystemMenu(Handle, True);
end;
Zjištění a přepínání aktuální klávesnice
Pokud vytváříte nějaký jednoduchý textový editor, můžete například na stavovém řádku informovat uživatele o právě aktuální klávesnici. Na to nám poslouží následující ukázka, která vrací jako textový řetězec označení aktuální klávesnice (např. "Cz" nebo "En" a podobně).
procedure TForm1.Button1Click(Sender: TObject);
var Klv: array[0..2] of Char;
begin
GetLocaleInfo(LOWORD(GetKeyboardLayout(0)), LOCALE_SENGLANGUAGE, Klv, 2);
ShowMessage(Klv);
end;
A když už jsme narazili na téma klávesnice, ukážeme si ještě, jak se lze mezi jednotlivými klávesnicemi přepínat. Kratičký kód, který teď uvedu, způsobí, že dojde k přepnutí na následující klávesnici. V tom případě, že máte nainstalovány pro českého uživatele běžné dvě klávesnice (českou a anglickou), dojde při opětovném volání této funkce k opětovnému přepnutí na původní klávesnici, takže se vlastně klávesnice cyklicky střídají.
procedure TForm1.Button1Click(Sender: TObject);
begin
ActivateKeyboardLayout(HKL_NEXT, 0);
end;
A pro úplnost ještě dodávám, že změnou parametru na HKL_PREV přepneme na předchozí klávesnici, což sice v případě dvou nainstalovaných klávesnic bude vypadat stejně jako první příklad, ale využití se při větším počtu klávesnic může hodit.
Dříve tomu sice tak nebývalo, ale dnes má asi zvukovou kartu opravdu již téměř každý, obzvlášť když je dnes již běžně integrována na deskách. Přesto se může někdy hodit detekce, zda se přece jen v systému nachází. Zvuková karta asi není v naší ukázce přesný pojem, protože se jedná spíše o "WaveOut" zařízení a například na mém systému se tak tváří i VoiceModem, ale pro hrubou orientaci to postačí. Ještě dodávám, že je třeba použít knihovny
MMSystem.
procedure TForm1.Button1Click(Sender: TObject);
begin
if WaveOutGetNumDevs > 0 then ShowMessage(`Zvukovka je přítomna`)
else ShowMessage(`Zvukovka není přítomna`);
end;
Přehrávání systémových zvuků
A na závěr tu máme opět snad o něco užitečnější tip, než byl ten předchozí. Ukážeme si, jak se dají přehrávat rozličné systémové zvuky, které všichni dobře známe. I zde využijeme knihovny
MMSystem a celý kód vypadá velmi jednoduše:
procedure TForm1.Button1Click(Sender: TObject);
begin
PlaySound(`SystemStart`, 0, SND_APPLICATION or SND_NODEFAULT or SND_ASYNC or SND_NOWAIT);
end;
Nejdůležitějším parametrem je hned ten první, neboť určuje, který systémový zvuk bude přehrán. V naší ukázce je to zvuk startu systému. V následující tabulce můžete najít některé další možné parametry s krátkým popisem (najít se dají v systémovém registru pod HKEY_CURRENT_USER\AppEvents\EventLabels)
AppGPFault |
chyba programu |
Close |
konec programu |
CriticalBatteryAlarm |
upozornění při kritickém stavu baterie |
EmptyRecycleBin |
vysypání koše |
MailBeep |
oznámení o nové poště |
Maximize |
maximalizace |
MenuCommand |
příkaz z nabídky |
MenuPopup |
stažení nabídky |
Minimize |
minimalizace |
Navigating |
začátek navigace |
Open |
spuštění programu |
RestoreDown |
obnovení z maxima |
RestoreUp |
obnovení z minima |
SystemAsterisk |
hvězdička |
SystemExclamation |
výkřik |
SystemExit |
konec Windows |
SystemHand |
kritické zastavení |
SystemQuestion |
otázka |
SystemStart |
spuštění Windows |
A to je pro dnešek všechno. Příště opět nebude jednotné téma, takže budeme v tomto mixu různých tipů pokračovat.