【问题标题】:Can I use ChangeWindowMessageFilter to receive DocumentComplete events from Protected Mode IE?我可以使用 ChangeWindowMessageFilter 接收来自保护模式 IE 的 DocumentComplete 事件吗?
【发布时间】:2009-06-07 05:20:57
【问题描述】:

在我的应用程序中,我想打开一个新的 IE 窗口,然后接收并处理从新打开的 IE 触发的 DocumentCompleteNavigateComplete2 事件。在 XP 中,一切正常。在 Vista 中,新的 IE 在保护模式下运行,所以我的应用程序无法从 IE 接收 DocumentCompelte 事件。

我不想更改任何安全级别,例如关闭以保护模式打开 IE 或降低我的应用程序完整性。我想知道是否可以使用 ChangeWindowsMessageFilter 来接收来自保护模式 IE 的 DocumentComplete 和 NavigateComplete2 事件?我的代码是这样的:

   ChangeWindowMessageFilter(DISPID_DOCUMENTCOMPELTE, MSGFLT_ADD );
   ChangeWindowMessageFilter(DISPID_NAVIGATECOMPLETE2, MSGFLT_ADD );

谢谢!

【问题讨论】:

    标签: c++ windows-vista activex browser uac


    【解决方案1】:

    没有。 ChangeWindowMessageFilter() 仅适用于窗口消息(例如 WM_CREATE)。

    DWebBrowserEvents2()“消息”是通过 COM 调用的 Dispinterface 事件,与窗口消息无关。

    编辑:

    来自documentation

    如果您的应用程序启动 Internet 使用 CoCreateInstance 的资源管理器和 你需要继续控制 IE启动后的导航,你 可以使用 IWebBrowser2 导航 Internet Explorer 以编程方式。 你只能继续控制 如果 IE 启动后的导航 您的应用程序具有相同的 作为 IE 进程的完整性级别 推出。一旦你的申请 导航到不同的 URL 完整的IE进程,你不能 执行额外的导航。你 应该使 IE 框架在之后可见 导航。

    所以我怀疑你正在成为一些类似问题的受害者。您需要将您的进程作为低完整性进程运行,或者以更高的完整性级别运行网络浏览器。有关如何控制应用程序启动方式(清单)的详细信息,请参阅此document

    如果您实际上不需要完整的浏览器,请考虑CoCreateInstance(CLSID_WebBrowser)

    【讨论】:

    • 有没有办法在 Vista 中打开被阻止的 Dispinterface 事件?谢谢!
    • 我不认为你在问正确的问题,因为你的问题没有任何意义。首先,您是如何订阅这些活动的?
    • 我的问题确实有道理。这是我订阅事件的方式。 hr = pNewBrowserEvtHandlerObj->DispEventAdvise(m_spNewWebBrowser2);即使UAC开启,返回hr也是S_OK,所以事件订阅是好的。唯一的问题是没有事件进入。如果 UAC 关闭,或者以管理员身份运行应用程序,那么一切正常。
    • 你是如何创建 WebBrowser2 的?
    • 这里是创建新网络浏览器的代码。 m_spNewWebBrowser2.CoCreateInstance(CLSID_InternetExplorer);
    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多