zoukankan      html  css  js  c++  java
  • 通过HWND获得IHTMLDocument2

    本博文的内容基本取自“微软帮助和支持”上的一篇文章:《How to get IHTMLDocument2 from HWND》,但是里面的代码有个小错误会使获得的IHTMLDocument2无法使用,可能是版本问题,这里先提出修改方法:把代码中的IID_IHTMLDocument改为IID_IHTMLDocument2

    注意:该方法只对采用IE内核(Trident)的浏览器有效,包括360安全浏览器、腾讯TT、世界之窗、绿色浏览器等。

    下面先给出示例代码,对《How to get IHTMLDocument2 from HWND》中的代码除了前面提到的修改,就不再做其他改动了。

    #include <mshtml.h>
    #include <atlbase.h>
    #include <oleacc.h>

    BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
    {
    TCHAR buf[100];

    ::GetClassName( hwnd, (LPTSTR)&buf, 100 );
    if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
    {
    *(HWND*)lParam = hwnd;
    return FALSE;
    }
    else
    return TRUE;
    };

    // 你可以将接口指针保存到一个成员变量中以便访问
    void CDlg::OnGetDocInterface(HWND hWnd)
    {
    CoInitialize( NULL );

    // 显式加载MSAA,这样我们就可以知道它是否已经被安装
    HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
    if ( hInst != NULL )
    {
    if ( hWnd != NULL )
    {
    HWND hWndChild=NULL;
    // 获取第一个文档的窗口句柄
    ::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
    if ( hWndChild )
    {
    CComPtr<IHTMLDocument2> spDoc;
    LRESULT lRes;

    UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
    ::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );

    LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
    if ( pfObjectFromLresult != NULL )
    {
    HRESULT hr;
    hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument2, 0, (void**)&spDoc );
    if ( SUCCEEDED(hr) )
    {
    // 将网页背景色改为红色
    spDoc->put_bgColor( CComVariant("red") );
    }
    }
    } // else 文档未就绪
    } // else IE未运行
    ::FreeLibrary( hInst );
    } // else MSAA未安装
    CoUninitialize();
    }

    代码中对MSAA的显式加载是用于早期Windows版本,Windows 2000 以后的操作系统都包含了MSAA,无需动态加载,直接使用ObjectFromLresult

  • 相关阅读:
    C#中添加文本框的上标及文字大小
    综采工作面设备接替计划管理系统
    一位年轻女董事长的27条忠告
    开发人员一定要加入收藏夹的网站
    哈佛图书馆墙上的名训
    加密、解密.NET字符串
    C#文件上传下载
    DotNetNuke3.0.8 简体中文语言包(可直接导入版)发布
    DNN的Core Team
    DotNetNuke3.0.8文件管理器的错误及解决方法
  • 原文地址:https://www.cnblogs.com/wxxweb/p/2316942.html
Copyright © 2011-2022 走看看