Dnes tu máme opět mix různých tipů ze všech možných oblastí. Nejprve něco o konzolových aplikacích, poté dvě funkce
WebBrowseru a nakonec funkce pro detekci aktivního okna.
Téměř konzolová aplikace
Nejprve začneme velmi jednoduchým tipem, který jsem před časem zahlédl a možná by mohl být pro některé z vás užitečný. Týká se konzolových aplikací. Někdy potřebujeme vytvořit velmi malou aplikaci, bez VCL a vlastně kompletně bez grafického prostředí. Řešením je obvykle vytvoření konzolové aplikace, která má jen minimální velikost. Někdy ovšem může nastat ještě další extrém a sice že nepotřebujeme ani žádný vstup od uživatele. V tom případě se nám konzolové okno otevře zbytečně a jen mate uživatele. Proto si ukážeme "konzolovou aplikaci" bez okna. Jednoduchým, i když poněkud svérázným řešením, je odstranit ze zdrojového kódu tento řádek:
{$APPTYPE CONSOLE}
To je vše. Ano, je to tak, tímto způsobem už aplikace nebude nadále konzolovou. Nemůžete tedy používat jakékoliv vstupně výstupní příkazy, které mají něco zobrazit uživateli a nebo si vyžadují jeho interakci.
Zakázání kontextové nabídky a klávesových WebBrowseru
V programech se občas využívá komponenty TWebBrowser. Někdy ke složitějším operacím, jindy jen k pouhému zobrazení připravené webové stránky (a nebo si ji online stáhne z internetu). Využívá se například v dialogu "O aplikaci", kdy může stahovat z webu autora aktuální informace o programu a další novinky. Problém je však v tom, že se chová téměř jako běžný prohlížeč (využívá vlastně IE), takže funguje i kontextová nabídka, která umožňuje napáchat všelijaké "škody". Lépe tedy bude znemožnit její zobrazení a podobným nepravostem zabránit. V naší ukázce se místo menu zobrazí jednoduchý ShowMessage, ale můžeme zobrazit vlastní připravené menu. Na formulář stačí umístit komponentu ApplicationEvents a nastavit její událost OnMessge následujícím způsobem.
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if (Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONDBLCLK) then
if IsChild(Webbrowser1.Handle, Msg.hwnd) then
begin
ShowMessage(`Zde se ma zobrazit vlastni menu`);
Handled := True;
end;
end;
S předchozím tipem souvisí i ten následující. Škodu by mohla teoreticky napáchat i nějaká klávesová zkratka, kterou by uživatel v nepravý čas použil. Příkladem budiž otevření nového okno zkratkou CTRL+N, ale jistě přijdete i na další. Jejímu stisku zabráníme velmi podobným způsobem jako v předchozím případě opět s využitím ApplicationEvents.
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if (GetKeyState(VK_CONTROL) < 0) and (Msg.Message = WM_KEYDOWN) and (Msg.wParam = Ord(`N`)) then Handled := True;
end;
Poslední dnešní tip bude opět poněkud systémovější záležitost. Naučíme se jednoduchým způsobem zjistit, které okno je momentálně aktivní, v popředí. Funkce pak můžete využít například při vytváření programu pro sledování chování systému (resp. uživatele), kdy si z naměřených dat můžete snadno udělat obrázek o tom, jaké programy a jak dlouho byly používány. I když je pravda, že podobnou funkci by bylo asi lepší provést jiným způsobem, ale přesto se někomu může hodit i tato jednoduchá verze.
function ActiveCaption: string;
var
Handle: THandle;
Len: LongInt;
Title: string;
begin
Result := ``;
Handle := GetForegroundWindow;
if Handle <> 0 then
begin
Len := GetWindowTextLength(Handle) + 1;
SetLength(Title, Len);
GetWindowText(Handle, PChar(Title), Len);
ActiveCaption := TrimRight(Title);
end;
end;
Funkci můžete pro otestování například "navěsit" na Timer, který bude v pravidelných intervalech zjišťovat aktuální okno a vypisovat například do Mema. A to je pro dnešek vše, ukázková aplikace není tentokrát potřeba.