Tipy a triky v Delphi, díl 18.

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;

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.

Diskuze (1) Další článek: Laureáti Nobelovy ceny chválí Internet

Témata článku: Software, Windows, Programování, Přepnutí klávesnice, Automatické zvyšování, Přesná hodnota, Anglická klávesnice přepnutí, TRI, Následující aplikace, Minor, Filename, Díl, Původní číslo, Win + Shift, Trik, DEL, Textový řetězec, Pointer, Obdobný postup, Původní klávesnice


Určitě si přečtěte

Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

Apple Macbook Air M1: testujeme výkon, výdrž, a hlavně kompatibilitu aplikací [průběžně aktualizováno]

** Testujeme Apple Macbook Air s procesorem M1 ** Zajímá nás nejen výkon, ale zejména kompatibilita aplikací ** Článek je průběžně doplňován na základě vašich dotazů

Jiří Kuruc | 205

Jiří Kuruc
Apple
Archivovat data do cloudu, na HDD, SSD, DVD, nebo Blu-ray? Co je nejvýhodnější?

Archivovat data do cloudu, na HDD, SSD, DVD, nebo Blu-ray? Co je nejvýhodnější?

** Kam doma natrvalo uložit data? Vyplatí se ještě optická média? ** Jaké kapacity disků a médií má smysl koupit? ** Cenovou výhodnost si ukážeme na příkladech s 2TB úložištěm

Lukáš Václavík | 118

Lukáš Václavík
ZálohováníÚložištěPevné disky
Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

Vybíráme nejlepší monitory: Od úplně levných až po displeje na rozmazlování očí

** Vybrali jsme nejlepší monitory na práci i pořádné hraní ** Nejlevnější monitor s kvalitním panelem nestojí ani tři tisíce ** Rozlišení 4K a větší obrazovka už není nedostupný luxus

David Polesný | 30

David Polesný
Monitory
Micro:bit V2: Tuto destičku plnou čipů dokáže naprogramovat i vaše babička

Micro:bit V2: Tuto destičku plnou čipů dokáže naprogramovat i vaše babička

** Chcete se teď hned naučit programovat čipy? ** Nechcete nic instalovat a číst zdlouhavé manuály? ** Naprogramujeme si Micro:bit, který zahraje Tichou noc

Jakub Čížek | 33

Jakub Čížek
Pojďme programovat elektronikuProgramování pro děti
26 užitečných rozšíření pro Chrome: Naučte prohlížeč nové věci

26 užitečných rozšíření pro Chrome: Naučte prohlížeč nové věci

** Prohlížeč Chrome obsahuje širokou škálu funkcí, neumí ale všechno ** Jeho schopnosti můžete rozšířit pomocí rozšíření ** Vybrali jsme pro vás zajímavé a užitečné doplňky

Karel Kilián | 44

Karel Kilián
Doplňky do prohlížečeChromeProhlížeče
Nejlepší příslušenství k počítači. Tipy na osvědčené klávesnice, tiskárny, routery…

Nejlepší příslušenství k počítači. Tipy na osvědčené klávesnice, tiskárny, routery…

** Tipy na užitečné příslušenství k počítačům ** Poradíme, s jakými produkty neuděláte chybu ** Některé z věcí mohou být dobrými vánočními dárky

David Polesný, Stanislav Janů | 20

David PolesnýStanislav Janů
Příslušenství
Vodafonu se zhroutila kabelovka. Síť bývalého UPC má výpadky
Lukáš Václavík
VodafoneUPC

Aktuální číslo časopisu Computer

Jak prodloužit výdrž notebooku

Velké testy: gamepady a inkoustové tiskárny

Důkladný test Sony Playstation 5