Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 18. - Minimalizace a obnovení všech běžících aplikací; Zjištění verze aplikace; Zamezení a opětovné povolení pohybu formuláře; Zjištění a přepínání aktuální klávesnice; Detekce zvukové karty; Přehrávání systémových zvuků

Jan Šindelář - 21.11.2001

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;

Zjištění verze aplikace

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.

Detekce zvukové karty

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.