uses
ActiveX, Shdocvw_tlb, MSHTML_TLB;
type
TObjectFromLResult =
function(LRESULT: lResult;
const IID: TIID;
wParam: wParam;
out pObject): HRESULT;
stdcall;
function GetIEFromHWND(WHandle: HWND;
var IE: IWebbrowser2): HRESULT;
var
hInst: HWND;
lRes: Cardinal;
Msg: Integer;
pDoc: IHTMLDocument2;
ObjectFromLresult: TObjectFromLresult;
begin
hInst := LoadLibrary('
Oleacc.dll'); @ObjectFromLresult :=
GetProcAddress(hInst, '
ObjectFromLresult');
if @ObjectFromLresult <>
nil then
begin
try
Msg := RegisterWindowMessage('
WM_HTML_GETOBJECT');
SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
if Result = S_OK
then
(pDoc.parentWindow
as IServiceprovider).QueryService(IWebbrowserApp,
IWebbrowser2, IE);
finally
FreeLibrary(hInst);
end;
end;
end;
function GetActiveIEURL:
string;
var
Document: IHtmlDocument2;
IE: IWebBrowser2;
Wnd: HWND;
WndChild: HWND;
begin
Wnd := GetForeGroundWindow;
WndChild := FindWindowEX(Wnd, 0, '
Shell DocObject View',
nil);
if WndChild <> 0
then
begin
WndChild := FindWindowEX(WndChild, 0, '
Internet Explorer_Server',
nil);
if WndChild <> 0
then
begin
GetIEFromHWnd(WndChild, IE);
if IE <>
nil then
begin
Result := IE.LocationURL;
end;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Caption := GetActiveIEURL;
end;