Delphi通过IE窗口句柄获取网页接口(IWebBrowser2)
2018-02-27 00:00
696 查看
主要用到的是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;
相关文章推荐
- Delphi通过IE窗口句柄获取网页接口(IWebBrowser2)
- Delphi通过IE窗口句柄获取网页接口(IWebBrowser2) good
- Delphi获取所有打开的IE窗口的网页源码
- 通过窗口句柄获得 IWebBrowser2 接口源码
- Delphi获取其它进程窗口句柄的3种方法
- IE和FF下javascript获取网页及窗口大小的区别
- IE和FF下javascript获取网页宽高及窗口大小
- Delphi获取其它进程窗口句柄的3种方法
- 通过窗口句柄获取窗口指针!
- IE和FF下javascript获取网页宽高及窗口大小
- 通过进程exe名称获取窗口句柄
- Delphi获取其它进程窗口句柄的3种方法
- 通过进程名获取主框架窗口句柄
- C# 通过HWND获取IE的IWebBrowser2接口
- WTL 通过IWebBrowser2接口使WebBrowser控件在自己的窗口打开网页
- Delphi获取其它进程窗口句柄的3种方法
- Delphi获取其它进程窗口句柄的3种方法
- WTL 通过IWebBrowser2接口使WebBrowser控件在自己的窗口打开网页
- vs不支持通过afxgetmainwnd()获取窗口句柄(转)
- Delphi控件IE窗口打开网页