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;

时间: 2024-08-07 22:55:03

Delphi通过IE窗口句柄获取网页接口(IWebBrowser2)的相关文章

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

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

delphi webbrowser 获取网页源码

转自 http://hi.baidu.com/delphidiary 转自 http://blog.sina.com.cn/s/blog_725fb194010150jh.html //前面要加几个pas单元uses Registry,ShellApi, WinInet,ShlObj,ComObj;//========================================删COOKIES========================== procedure DelRegCache;

Delphi XE下获取网页源码记录

存放个自己写的获取网页源码,掌握了: 1.利用CreateOLEObject方式获取源码 2.自动判断网页格式编码 需要使用到的单元:Winapi.ActiveX,System.Win.ComObj,System.WideStrUtils 需要创建结构体:TResultWebHtml (用于存放返回的源码和Cookies) Uses Winapi.ActiveX,System.Win.ComObj,System.WideStrUtils; type TResultWebHtml = record

IXMLHTTPRequest获取网页源码的心得

在万一老师的博客看到一种利用IXMLHTTPRequest来获取网页源码的方法,但有2个问题没解决,自己研究了下改进了方法. 1.如果网页进行301转跳将无法获取源码 2.如果网站是gb2312编码将获取的是乱码 /////以下方法使用的是Delphi xe2编写 uses MsXML,activex; function GETHTML (const URL : string):string; // XMLHTTP接口Var XMLHTTP:IServerXMLHTTPRequest; HTML

获取网页上数据(图片、文字、视频)-b

Demo地址:http://download.csdn.net/detail/u012881779/8831835 获取网页上所有图片.获取所有html.获取网页title.获取网页内容文字... .h 文件  代码: //网页   //NSString *strPath = [NSString stringWithFormat:@"http://www.baidu.com/s?wd=%@&cl=3",theWord];   //视频   //NSString *strPath

POST教程笔记 - WinHttp获取网页源码

①.WinINet与WinHttp的异同点,为什么使用WinHttp讲解? 详情见:<WinINet与WinHttp总结>文档,已经打包给大家了. ②.WinHttp接口调用方式:微软官方地址:http://msdn.microsoft.com/en-us/ ... 84263(v=vs.85).aspxWinHttp微软提供了两种调用方式:C++调用API的版本.COM组件的版本.这里面使用的是 C++ Interface 接口的组件的方式来给大家讲解. ③.WinHttp常用命令讲解:详情

【转】如何在Windows+VS2005使用最新静态libcurl 7.35.0获取网页数据,支持HTTPS

地址: http://blog.csdn.net/hujkay作者:Jekkay Hu([email protected])关键词:Windows,curl,ssl,  visual c++ 2005, libcurl, https,网页抓取时间: 2014/2/18 1. 概述 由于Curl提供强大的网络功能,支持HTTP,HTTPS, DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP

DELPHI 通過窗口句柄或窗口标题得到进程句柄

DELPHI 通過窗口句柄或窗口标题得到进程句柄2009年05月08日 星期五 10:15procedure TForm1.Button1Click(Sender: TObject);varhWindow: HWND; { 窗体句柄 }dwProcessID: DWORD; { 进程 ID }hProcess: THandle; { 进程句柄 }begin{ 根据标题获取窗体的句柄 }hWindow := FindWindow(nil, '标题'); { 通过窗体句柄获取进程 ID }GetWi

C# HttpWebRequest 绝技 根据URL地址获取网页信息

如果要使用中间的方法的话,可以访问我的帮助类完全免费开源:C# HttpHelper,帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取 1.第一招,根据URL地址获取网页信息 先来看一下代码 get方法 复制代码 publicstaticstring GetUrltoHtml(string Url,string type) { try { System.Net.WebRequest wReq = System.Net.WebRequest.Create(U