zoukankan      html  css  js  c++  java
  • 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, 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;

    调用例子,以下代码快速关闭所有打开的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, hTabWnd, 'Frame Tab', nil);
               if hTabWnd <> 0 then hCldWnd := FindWindowEx(hTabWnd, 0, 'TabWindowClass', nil);
               if hCldWnd <> 0 then hCldWnd := FindWindowEx(hCldWnd, 0, 'Shell DocObject View', nil);
               if hCldWnd <> 0 then hCldWnd := FindWindowEx(hCldWnd, 0, '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;

  • 相关阅读:
    DataTablez转List对象效率慢的问题.
    Oracle 删除重复数据
    1.layui 添加旋转等待, 2.div里面加载HTML页面
    layui-table JSON.stringify()序列化出来的不同行数据类型错误.导致后台转成表格的时候出错.(常用)
    0基础学MVC课程
    构造函数的执行顺序
    html控件自动点 “加号”添加 多个附件
    C#委托之个人理解 转自 loose_went
    一步一步学Linq to sql系列文章 转lovecherry
    使用AOP 使C#代码更清晰 转yanghua_kobe
  • 原文地址:https://www.cnblogs.com/stroll/p/4716298.html
Copyright © 2011-2022 走看看