微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi通过IE窗口句柄获取网页接口IWebBrowser2

主要用到的是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;

调用例子,以下代码快速关闭所有打开的IE窗口:

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] 举报,一经查实,本站将立刻删除。

相关推荐