
A mellékelt példaprogram megnyitása előtt a MaskIEURL.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
A komponensünkben készítenünk kell egy függvényt, mely lekérdezi az Internet Explorer-ben aktuálisan megnyitott weboldalak listáját. Mindehhez azonban először a futó alkalmazások listájában meg kell keresnünk az IE ablakokat. Ezt az EnumWindows függvénnyel tehetjük meg, melynek első paraméterként egy függvényt kell megadnunk. Az EnumWindows ezt a függvényt fogja meghívni annyiszor, ahány IE alkalmazás fut. Így minden esetben meg kell vizsgálnunk ennél a függvénynél az aktuális ablak fejlécét, és ha rátalálunk a keresettre, elvégezzük a megfelelő vizsgálatot. Második paraméterként egy tetszőleges értéket adhatunk meg LPARAM típusban, mely egy 32 bites számnak felel meg. Az EnumWindows függvényt a Refresh eljárásban hívjuk meg, így mindig az aktuális listát kapjuk.
EnumWindows(@GetUrlFromIE, LParam(FURLList.Items));
Láthatjuk, hogy első paraméterként a GetUrlFromIE függvényt adtuk meg, így az EnumWindows ezt fogja meghívni. Lássuk ennek felépítését:
function GetUrlFromIE (Handle: THandle; List: TStringList): boolean; stdcall;
var
hWndIE, hWndIEChild : HWND;
Buffer : array[0..255] of Char;
begin
A SendMessage függvénnyel lekérdezzük a Handle paraméter által meghatározott ablak Caption részét, majd bemásoljuk azt a Buffer tömbbe.
SendMessage(Handle, WM_GETTEXT, 255, integer(@Buffer[0]));
Megkeressük azt az Internet Explorer ablakot, melynek fejléce megegyezik a Buffer tömbben tárolt értékkel.
hWndIE := FindWindow('IEFrame', Buffer);
if hWndIE > 0 then
begin
Ezután megszerezzük az IE Toolbar-jához a hozzáférést.
hWndIEChild := FindWindowEx(hWndIE, 0, 'WorkerW', nil);
if hWndIEChild > 0 then
begin
Következő lépésben az Address Bar-hoz kell hozzáférnünk.
hWndIEChild := FindWindowEx(hWndIEChild, 0, 'ReBarWindow32', nil);
if hWndIEChild > 0 then
begin
Végül a címet az azt tartalmazó ComboBox-ból ki kell olvasnunk, majd a függvényünk List paraméterében meghatározott StringList-nek átadnunk.
//finally, locate combo box and add its text to the list
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;
A fenti függvény által kapott értékeket egy általunk kiválasztott ListBox-ban tárolhatjuk el, melyet a komponens URLList property-jében kell megadnunk. Amennyiben ebből a listából kiválasztunk egy URL-t, a CloseURL függvénnyel be is zárhatjuk a hozzá tartozó IE ablakot.
procedure TMaskIEURL.CloseURL;
var
Handle : THandle;
begin
if FURLList.ItemIndex = -1 then
begin
ShowMessage('Válasszon egy IE ablakot az URL listából!');
Exit;
end;
A kiválasztott ablakot a WM_CLOSE rendszerüzenet elküldésével zárhatjuk be.
Handle := THandle(FURLList.Items.Objects[FURLList.ItemIndex]);
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
Lehetőségünk van több ablak kiszűrésére is. A maszkot a komponens MaskList property-jében megadott ListBox-ban kell eltárolnunk. Ezeket a CloseMaskURL függvény meghívásával zárhatjuk be.
procedure TMaskIEURL.CloseMaskURL;
var
i,j : integer;
Handle : THandle;
begin
Egyenként összehasonlítjuk az aktuális ablakok és a maszkolt ablakok listájában szereplő URL-eket. Amennyiben egyezést találunk, bezárjuk az ablakot.
for i := 0 to FURLList.Items.Count-1 do
begin
for j := 0 to FMaskList.Items.Count-1 do
if MatchesMask(FURLList.Items[i], '*' + FMaskList.Items[j] + '*') then
begin
Handle := THandle(FURLList.Items.Objects[i]);
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
end;
end;