получить доступ к новому окну внутри события нового окна

Я использую элемент управления веб-браузером в своем приложении для получения данных с определенной веб-страницы. Эта веб-страница не будет работать со старой версией IE, поскольку она специально проверяет версию IE. Поэтому я внес изменения в реестр, которые позволяют моему приложению работать как IE 9, и большую часть времени все в порядке...

Проблема в том, что нужно открыть новое окно. Он ничего не будет отображать. Я предполагаю, что новое окно распознается как IE 7, и я не знаю, как заставить его маскироваться под IE9.

Я тоже пробовал наоборот. Я подумал, что если бы я перехватил URL-адрес нового окна, я мог бы просто отправить его в IE9 или открыть в другом экземпляре элемента управления веб-браузера. Но событие нового окна позволяет только отменить событие. Никакой полезной информации оттуда не почерпнешь.

Я считаю, что интероп-сервисы — это то, что мне нужно, но я ничего о них не знаю.

Итак, у меня есть два вопроса:
(1) Могу ли я заставить новое окно идентифицироваться как IE9? (и как...)
(2) Как я могу получить URL-адрес нового окна, используя службы взаимодействия (или что-то еще, мне все равно)?


person pzogr    schedule 25.08.2012    source источник


Ответы (2)


Довольно странно (с моей точки зрения), что элемент управления WebBrowser не отображает гораздо более полезное событие NewWindow3.

В этой статье CodeProject описывается удивительно простой способ сделать его доступным.

person J.Merrill    schedule 10.10.2012

В событии NewWindow, предполагая, что ваш первый элемент управления Wb называется WB1, а тот, на который вы хотите перенаправить, — WB2, выполните следующие действия в событии WB1 NW.

Processed = True ' This cancels the current request.
WB2.Navigate URL ' This redirects it to the second WB2 control.

В противном случае, если вы хотите использовать событие NW2 (NewWindow2) вместо события NewWindow (NW), сделайте это в событии NW2 элемента управления WB1.

Set ppDisp = WB2.object ' Just swaps the objects around to redirect, don't need to issue a cancel.

Также вы можете сделать это через BeforeNavigate2 (из WB1). Но немного другой код.

Cancel = True ' Cancel Request.
WB2.Navigate2 URL ' Reissue it to WB2.

Теперь, пока вы контролируете, куда он перенаправляется, вы можете легко получить новый URL-адрес окна, используя WB2.LocationURL или Wb2.Document.URL, если я не ошибаюсь.

Кроме того, если вы хотите изменить механизм рендеринга на IE9 (даже если IE9 установлен на вашем компьютере, управление WB будет использовать механизм рендеринга IE7 для совместимости)... в Интернете есть статьи и ответы на SO (включая некоторые из моих предыдущих ответов ), которые поясняют, как вы можете изменить реестр, чтобы механизм рендеринга, используемый элементом управления WB, был таким же, как и в установленной версии (IE9), в противном случае он всегда будет использовать IE7. А если на компьютере установлен IE4, 5 или 6, он всегда будет использовать IE4 для механизма рендеринга. Я думаю, что они обновляют версию рендеринга после 3-4 изменений версии. Я предполагаю, что в версии 10 версия рендеринга управления WB также будет версией 10.

Дайте мне знать, если вам нужна дополнительная помощь, и я хотел бы знать, как вы ладили, и помогло ли это ответить на ваш вопрос. Все мои примеры написаны на VB6, но вы можете легко их трансформировать.

Ваше здоровье.

person Erx_VB.NExT.Coder    schedule 31.08.2012
comment
Спасибо за ответ, но я не понимаю... Я не могу получить имя нового окна или какое-либо событие. Веб-страница открывает его, и я не могу его контролировать. Как я упоминал ранее, я внес необходимые изменения в реестр, чтобы мой элемент управления веб-браузером определялся как IE9, но новое окно, похоже, идентифицируется как IE7, хотя я не уверен в этом - я просто думаю, что это так, потому что это не будет работать! Итак, вопрос в том, как получить доступ к новому окну, которое я не создал... - person pzogr; 04.09.2012
comment
@pzogr внесение изменений в реестр, чтобы ваш элемент управления WB работал в режиме IE9, не составляет труда, мы вернемся к этому позже. прежде всего, должно быть событие WebBrowser1_NewWindow или WebBrowser1_NewWindow2, вы можете получить к нему доступ из списка событий, давайте сначала убедимся, что вы можете войти туда и увидеть событие, автоматически распечатанное из вашей Visual Studio IDE/Designer. Как только вы это сделаете, дайте мне знать, и мы продолжим оттуда. Конечно, как только вы найдете это, не стесняйтесь проверять переменные или размещать код, который я вам дал, при этом убедитесь, что ваш второй элемент управления WebBrowser имеет имя WB2, дайте мне знать - person Erx_VB.NExT.Coder; 04.09.2012
comment
Во-первых, я уже сказал, что изменения реестра на месте. Я знаю, что там нужно сделать, и я это сделал. О NewWindow: есть событие NewWindow, но, как я уже сказал, вы можете только отменить это событие (e.cancel=true). Кроме этого, у вас нет доступа к NewWindow. - person pzogr; 04.09.2012
comment
@pzogr Пожалуйста, расскажите мне аргументы, которые вы видите в событии NewWindow, а также попробуйте NewWindow2, если можете, когда метод события сгенерирован автоматически, скопируйте и вставьте аргументы, которые представлены в автоматически сгенерированном коде события для NewWindow2 и NewWindow. и мы возьмем его оттуда. Кроме того, что касается regedit, вы сказали, что второе окно может не распознаваться как IE9, поэтому я все еще пытаюсь помочь вам с этим, поскольку regedit должен гарантировать, что он работает с обоими элементами управления WB в вашей форме. Чтобы узнать наверняка, зайдите на whatsmyuseragent.com на обоих устройствах управления WB, и вы будете знать наверняка. - person Erx_VB.NExT.Coder; 06.09.2012
comment
Спасибо, что нашли время помочь! О реестре: я написал простой HTML-код с кодом javascript, который открывает новое окно, которое ведет на whatsmyuseragent.com, и доказал, что мое первоначальное предположение было неверным! Новое окно правильно идентифицируется как IE9. Я не могу понять, почему это не сработает, поэтому мне кажется, что лучшее решение - отклонить новое окно и отправить URL-адрес элементу управления веб-браузером. У меня нет события newwindow2, потому что я использую элемент управления веб-браузером. Я попробую с axWebBrowser и сообщу вам результаты. - person pzogr; 06.09.2012
comment
@pzogr, вы сказали, что у вас нет события NewWindow2, но есть ли у вас событие NewWindow? Если это так, скопируйте/вставьте автоматически сгенерированные аргументы внутри события NewWindow или любого другого события типа NewWindow, которое вы можете найти. Я спрашиваю вас, потому что я сам использую версию Visual Studio 6.0 (VB6) и еще не запустил VS2012. - person Erx_VB.NExT.Coder; 06.09.2012
comment
При использовании элемента управления веб-браузером, интегрированного с Visual Studio, вы получаете только аргумент e.Cancel с событием newwindow... Вы получаете события newwindow2 и newwindow3 при использовании axWebBrowser, который не интегрирован с Visual Studio. - person pzogr; 07.09.2012
comment
@pzogr, если бы вы могли скопировать/вставить весь аргумент и строку, это было бы здорово. Поскольку я не уверен, получаете ли вы это как e или на самом деле просто отменяете или как что-то вроде e.cancel, вы понимаете, что я имею в виду? в любом случае, если вы можете получить доступ к e.Cancel, все, что вам нужно сделать, это установить для него значение False, и в этом случае вам больше ничего не нужно, поскольку, когда вы выполняете перенаправление, вы делаете это на второй WB Управляет методом Navigate или Navigate2, поэтому предположим, что WB1 является первым окном с вашим аргументом e.Cancel, вы устанавливаете его в значение true и отправляете URL-адрес методу Navigate WB2, WB2.Navigate URL-адреса достаточно. - person Erx_VB.NExT.Coder; 13.09.2012
comment
@pzogr Поскольку я не уверен, как вы получаете аргумент, я предполагаю, что его e является System.Object, если это так, аргумент URL должен быть в объекте e, то есть: e.URL должен предоставить вам URL-адрес для перенаправления. Я уверен, что событие NewWindow отправит вам URL-адрес, еще раз, если он объявлен как объект, вы не получите intellisense и не будете знать об этом, если он объявлен как что-то конкретное, например: someObjectEventArgs вы получите intellisense при вводе е. чтобы вы поняли, с чем можно играть. Я предполагаю, что он объявлен как System.Object, поскольку вы не видите URL-адрес, пожалуйста, вставьте полную строку! - person Erx_VB.NExT.Coder; 13.09.2012
comment
@pzogr В худшем случае вы можете создать общедоступную переменную, которая всегда содержит последний запрос URL-адреса WB1, и устанавливать эту переменную во время каждого события BeforeNavigate/2, чтобы таким образом вы могли получить последний .Navigate'd URL в вашем событии NewWindow, и вы можете использовать его для перенаправления на WB2 или даже на WB1, если хотите. Конечно, это не лучший способ сделать что-то, и вам лучше получить URL-адрес из объекта e, который вы получаете из события NW, это будет либо e.URL, либо e.LocationURL, либо что-то в этом роде, но я не смогу сказать тебе после того, как ты его вставишь! - person Erx_VB.NExT.Coder; 13.09.2012
comment
e is CancelEventArgs... Я реализовал событие NewWindow3 и МОГУ получить URL-адрес, используя e.bstrUrl. Я МОГУ открыть его в другом объекте веб-браузера, но я НЕ МОГУ использовать e.ppDisp = (управление веб-браузером), чтобы сделать это, потому что я не получаю ничего на экране, кроме сообщений об ошибках сценария. URL-адрес не открывается в IE. Я попытался использовать Process для запуска нового экземпляра IE, но это не сработает. Я не могу представить, почему, поскольку он отлично работает в моем веб-браузере. Думаю, это источник всех проблем. Что-то мешает ему работать правильно, когда URL-адрес отправляется в IE (кстати, ppDisp имеет значение null) - person pzogr; 27.09.2012
comment
@pzogr, пожалуйста, скопируйте и вставьте все ваше событие NewWindow3 от начала до конца, включая код, который у вас есть, в свой вопрос, отредактировав свой вопрос, чтобы я мог попробовать то же самое на своем компьютере и решить его. Пожалуйста, ничего не оставляйте в пасте. Кроме того, просто чтобы напомнить мне, это происходит, когда вы нажимаете на ссылку, верно? Или вы делаете .Navigate2 прямо на этой странице? - person Erx_VB.NExT.Coder; 27.09.2012
comment
@pzogr Кроме того, я только что перечитал ваш вопрос и заметил, что вы хотите, чтобы обе вкладки браузера определялись как IE9? Посмотрите этот ответ, который я предоставил кому-то другому, я думаю, что он действительно может решить вашу проблему без необходимости иметь дело с событиями NW. Дайте мне знать, если это произойдет или нет. stackoverflow.com/questions/12490512/ - person Erx_VB.NExT.Coder; 27.09.2012
comment
Событие NewWindow дает вам возможность отменить его только с помощью e.cancel = true/false; Если вы используете axWebBrowser вместо WebBrowser, вы также получаете события NewWindow2 и NewWindow3. Там у вас больше возможностей. В NewWindow2 аргумент для e определяется как AxSHDocVw.DWebBrowserEvents2_NewWindow2Event. Замените 2 на 3, и вы получите событие NewWindow3. В NewWindow2 параметр e содержит следующие свойства: отмена, ppDisp, а в NewWindow3 он содержит: bstrUrl, bstrUrlContext, dwFlags, cancel, ppDisp. Дополнительную информацию можно найти на msdn.microsoft.com. /en-us/library/aa768337%28v=vs.85%29.aspx - person pzogr; 03.10.2012
comment
О, я забыл... Проблема возникает, когда я нажимаю кнопку «Печать», которая открывает новое окно и загружает документ в формате PDF. После всех поисков я обнаружил, что новое окно действительно идентифицируется как IE 9.0 (я сделал соответствующие изменения в реестре), но оно не открывает pdf. Он не откроет PDF-файл, даже если я получу URL-адрес с помощью axWebBrowser и более подробных событий NewWindow2 и 3 и отправлю его в новый экземпляр IE. Это работает, когда я отправляю URL-адрес экземпляру элемента управления веб-браузером! Что здесь может быть не так? - person pzogr; 03.10.2012