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

Tipy a triky v Delphi, díl 194. - Téměř konzolová aplikace, Zakázání kontextové nabídky a klávesových zkratek WebBrowseru, Funkce pro detekci aktivního okna

Jan Šindelář 27.7.2005

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 zkratek 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.