S Internet Explorerem jsme si v mých článcích 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.
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 s její pomocí naplnit náš ListBox:
procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
EnumWindows(@GetUrlFromIE, LParam(ListBox1.Items));
end;
Nakonec nám zbývá jen příslušné okno zavřít. To už je velmi snadné 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á.
Tentokrát si můžete jednoduchý ukázkový projekt s popsanými funkcemi stáhnout zde.