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

Tipy a triky v Delphi, díl 165. – blokujeme stránky v IE

Jan Šindelář 1.12.2004

S Internet Explorerem jsme si v našem seriálu hráli už mnohokrát. Tentokrát si vytvoříme skutečně užitečnou aplikaci nebo alespoň její základ. Naučíme se blokovat „závadné“ stránky.

Hned na začátku si stanovíme náš dnešní cíl. Nebudeme vytvářet žádný složitý plug-in, naše aplikace bude pouze kontrolovat ve spuštěných instancích IE adresu načtené stránky a pokud se bude nacházet na "black listu", jednoduše dané okno IE uzavře.

Budeme tedy potřebovat jen dvě hlavní funkce. Tou první zjistíme seznam spuštěných oken IE, resp. seznam otevřených stránek. V druhé fázi pak seznam prohledáme a okna s "vadným" obsahem uzavřeme. Nejprve tedy na prázdný formulář umístíme ListBox. Právě do něj si zapíšeme seznam nalezených oken IE, resp. adres. Dále přidáme na formulář tlačítko, které danou funkci spustí a naplní ListBox.

V našem seriálu už jsme kdysi funkci pro získání adresy s řádku IE používali, byl to tento díl. Abyste se necítili ošizeni, uděláme dnes stejnou věc poněkud jiným způsobem, ale postup si můžete v zásadě zvolit sami.

function GetUrlFromIE (Handle: THandle; List: TStringList): boolean; stdcall;
var
  hWndIE, hWndIEChild: HWND;
  Buffer: array[0..255] of Char;
begin
  SendMessage(Handle, WM_GETTEXT, 255, integer(@Buffer[0]));
  hWndIE := FindWindow(`IEFrame`, Buffer);
  if hWndIE > 0 then
  begin
    hWndIEChild := FindWindowEx(hWndIE, 0, `WorkerW`, nil);
    if hWndIEChild > 0 then
    begin
      hWndIEChild := FindWindowEx(hWndIEChild, 0, `ReBarWindow32`, nil);
      if hWndIEChild > 0 then
      begin
        hWndIEChild := FindWindowEx(hWndIEChild, 0, `ComboBoxEx32`, nil);
        if hWndIEChild > 0 then
        begin
          SendMessage(hWndIEChild, WM_GETTEXT, 255, integer(@Buffer));
          List.AddObject(Buffer,TObject(hWndIE));
        end;
      end;
    end;
  end;
  Result := True;
end;

Funkci tedy máme připravenou, zbývá nám naplnit s její pomocí náš ListBox:

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Clear;
  EnumWindows(@GetUrlFromIE, LParam(ListBox1.Items));
end;

Zbývá nám jen příslušné okno zavřít. To už je velmi snadné, i to jsme již mnohokrát dělali a využijeme k tomu zpráv systému Windows. Prostřednictvím identifikátoru jednotlivého okna, jeho Handle, dokážeme příslušnou zprávou dané okno uzavřít.

procedure TForm1.Button2Click(Sender: TObject);
var
  Handle : THandle;
begin
  if ListBox1.ItemIndex = -1 then Exit;
  Handle := THandle(ListBox1.Items.Objects[ListBox1.ItemIndex]);
  PostMessage(Handle, WM_CLOSE, 0, 0);
end;

A to je vlastně vše. To nejhlavnější máme hotovo. Nyní by bylo potřeba vypracovat nějaký "bezpečnostní model" pro automatické filtrování stránek. Prostě se okno nebude zavírat na základě stisknutého tlačítka, ale naše aplikace bude "číhat" na pozadí a kontrolovat otevřené stránky, které pak bude zavírat. Může mít v sobě integrován přímo konkrétní seznam nevhodných stránek. Můžeme však jít ještě o krok dále a třeba si vypracovat složitější filtr, který bude odchytávat i jednotlivé "nevhodné" výrazy z textu adresy, neboť ji máme uloženu jako text. Fantazii se meze nekladou, v každém případě pak metoda pro uzavření okna zůstane stejná.

I tentokrát si můžete jednoduchý ukázkový projekt s popsanými funkcemi stáhnout.