Можно ли использовать ChangeWindowMessageFilter для получения событий DocumentComplete из защищенного режима IE?

В моем приложении я хочу открыть новое окно IE, а затем получить и обработать события DocumentComplete и NavigateComplete2, запущенные из нового открытого IE. В XP все работает нормально. В Vista новый IE работает в защищенном режиме, поэтому мое приложение не может получать событие DocumentCompelte от IE.

Я не хочу менять какой-либо уровень безопасности, например отключать IE в защищенном режиме или снижать целостность моего приложения. Интересно, могу ли я использовать ChangeWindowsMessageFilter для получения событий DocumentComplete и NavigateComplete2 из защищенного режима IE? Мой код выглядит так:

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

Спасибо!


person bionicoder    schedule 07.06.2009    source источник


Ответы (1)


Нет. ChangeWindowMessageFilter() работает только с оконными сообщениями (например, WM_CREATE).

«Сообщения» DWebBrowserEvents2() представляют собой события Dispinterface, вызываемые через COM, и не имеют ничего общего с сообщениями окна.

Редактировать:

Из документации:

Если ваше приложение запускает Internet Explorer с помощью CoCreateInstance и вам необходимо продолжать управлять навигацией после запуска IE, вы можете использовать IWebBrowser2 для программной навигации по Internet Explorer. Вы можете продолжать управлять навигацией только после запуска IE, если ваше приложение имеет тот же уровень целостности, что и запущенный процесс IE. Как только ваше приложение перейдет к URL-адресу в другом процессе целостности IE, вы не сможете выполнять дополнительные переходы. Вы должны сделать IE Frame видимым после навигации.

Поэтому я подозреваю, что вы стали жертвой какой-то похожей проблемы. Вам нужно либо запустить свой процесс как процесс с низкой целостностью, либо запустить веб-браузер с более высоким уровнем целостности. Подробнее о том, как управлять запуском приложения, см. в этом документе. (манифест).

Если вам на самом деле не нужен полноценный браузер, рассмотрите CoCreateInstance(CLSID_WebBrowser).

person i_am_jorf    schedule 07.06.2009
comment
Есть ли способ открыть заблокированные события Dispinterface в Vista? Спасибо! - person bionicoder; 07.06.2009
comment
Я не думаю, что вы задаете правильные вопросы, так как ваши вопросы не имеют никакого смысла. Как вы подписываетесь на события в первую очередь? - person i_am_jorf; 07.06.2009
comment
Мой вопрос имеет смысл. вот как я подписываюсь на события. hr = pNewBrowserEvtHandlerObj->DispEventAdvise(m_spNewWebBrowser2); Даже UAC включен, время возврата S_OK, так что подписка на событие хорошая. Единственное, никаких событий не приходит. Если UAC выключен или приложение запущено от имени администратора, то все ок. - person bionicoder; 07.06.2009
comment
Как вы создаете WebBrowser2? - person i_am_jorf; 07.06.2009
comment
Вот код для создания нового веб-браузера. m_spNewWebBrowser2.CoCreateInstance(CLSID_InternetExplorer); - person bionicoder; 07.06.2009