主要用到的是MSAA(Microsoft Active Accessibility) 函数:ObjectFromLResult,该函数在动态链接库 oleacc.dll 中定义。
uses SHDocVw,MsHtml,ActiveX;
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
Result := S_False;
hInst := LoadLibrary('Oleacc.dll');
@ObjectFromLresult := GetProcAddress(hInst,'ObjectFromLresult');
if @ObjectFromLresult <> nil then begin
try
MSG := RegisterWindowMessage('WM_HTML_GetoBJECT');
SendMessageTimeOut(WHandle,MSG,SMTO_ABORTIFHUNG,1000,lRes);
Result := ObjectFromLresult(lRes,IHTMLDocument2,pDoc);
if Result = S_OK then
(pDoc.parentwindow as IServiceprovider).QueryService(IWebbrowserApp,IWebbrowser2,IE);
finally
FreeLibrary(hInst);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
hCurWindow,hMainWnd,hTabWnd,hCldWnd:HWnd; //窗口句柄
WinClsName:array[0..255] of char;
IE1: IWebbrowser2;
begin
hCurWindow := Getwindow(Handle,GW_HWNDFirst); //获取第一个窗口的句柄
while hCurWindow<>0 do
begin
GetClassName(hCurWindow,@WinClsName,255);
if String(WinClsName) = 'IEFrame' then
begin
hMainWnd := hCurWindow;
hCldWnd := hCurWindow;
hTabWnd := 0;
repeat //循环查找所有选项卡
hTabWnd := findwindowex(hMainWnd,'Frame Tab',nil);
if hTabWnd <> 0 then hCldWnd := findwindowex(hTabWnd,'TabWindowClass',nil);
if hCldWnd <> 0 then hCldWnd := findwindowex(hCldWnd,'Shell DocObject View','Internet Explorer_Server',nil);
if hCldWnd <> 0 then if GetIEFromHWnd(hCldWnd,IE1) = S_OK then //获取IWebbrowser2
begin
IE1.Quit; //关闭IE,也可以执行其他操作,呵呵
end;
until hTabWnd = 0;
end;
hCurWindow:=Getwindow(hCurWindow,GW_HWNDNEXT); //获取下一个窗口的句柄
end;
end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。