天天看點

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; 





function Tfrm_Main.GetValueByHTMLDocument(): string;
var
  Dispatch: IDispatch;
  Web: IWebBrowser2;
  ShellWindow: IShellWindows;
  i: integer;
  sUserID,sIP: string;
  Finput: IHTMLInputElement;
  HTMLDocument: IHTMLDocument2;
  LoginListTemp:array[1..7]of string;
begin
  Result := '';

  // tmr3.Enabled:= False;

  ShellWindow := CoShellWindows.Create;
  Move(ListLogin,LoginListTemp,SizeOf(LoginListTemp));
  for i := 0 to ShellWindow.Count do
  begin
    try
      Dispatch := ShellWindow.Item(i);
      if Dispatch = nil then continue;
      Dispatch.QueryInterface(IWebBrowser2, Web);
      if Web = nil then continue;
      if Pos('iexplore.exe', LowerCase(Web.FullName)) = 0 then Continue;

      if Pos('http://15.0.32.10:1320/cos_tapp/', LowerCase(Web.LocationURL)) <0 then Continue;

      Web.Document.QueryInterface(IHTMLDocument2, HTMLDocument);

      if HTMLDocument = nil then Exit;

      Finput := HTMLDocument.all.item('ipt_userCode',varEmpty) as IHTMLInputElement;

      if Finput <> nil then
      begin
        Result := Finput.value;  // 工号

        if AnsiIndexText(Result, ListLogin) >= 0 then
        begin
          try
             sIP := GUserParam.UserIP;
             //WriteTxtLog('  IP: '+sIP+', 嘗試登陸排程工号: '+Result+'。');
             HTMLDocument.parentWindow.execScript('document.getElementById(''ipt_userCode'').value=''您已被記錄,請不要嘗試登陸排程工号!'';','javascript');
             IPCrab(sIP);

          except on e: Exception do
            begin
              WriteLog('浏覽器安全等級過高,請降低安全等級! ' + e.Message,'E');
            end;
          end;
        end;
      end;
    except on e: Exception do
      begin

      end;
    end;
  end;
end;

           

版權聲明:本文為CSDN部落客「weixin_34014555」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_34014555/article/details/92007873

上一篇: js技巧大集
下一篇: js 進階應用