none
Как отображать новое окно axwebbrowser в WinForm RRS feed

  • Вопрос

  • Здравствуйте!

    Есть форма на ней есть компонент Microsoft Web Browser. Когда я загружаю необходимый мне документ с javasscript'ом, то создается новое окно браузер. Я хочу чтобы этого окна не было, а информация отображалось бы в браузере формы. Для этого я использую событие NewWindow2, в котором такой код

     private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
        {
          axWebBrowser2.RegisterAsBrowser = true;
          e.ppDisp = axWebBrowser2.Application;
          axWebBrowser2.Parent = axWebBrowser1;
        }
    

    Результат естественно получается не совсем такой какой ожидается. Окно в форме, но поменять его расположение не получается.  Что необходимо сделать, чтобы все правильно отображалось.

    Заранее спасибо за помощь. 

    21 декабря 2010 г. 11:56

Ответы

  • Проблема решена следующим способом:

     

     private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
     {
      axWebBrowser2.RegisterAsBrowser = true;
      e.ppDisp = axWebBrowser2.Application;
     }
    
     private void axWebBrowser2_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
     {
      axWebBrowser2.Location = new Point(569, 12);
      axWebBrowser2.Size = new Size(600, 500);
     }
    

     

    Теперь второе окно будет открываться в форме (тем самым как бы затирая первый axWebbrowser1) с указанными размерами и расположением на форме.

    Может есть более элегантный способ ??  

    необходимый DOM можно извлечь так (правда я в нем мало что понимаю, так как описания mshtml библиотеки найти не удалось)

       
       IHTMLDocument3 html3 = (IHTMLDocument3)axWebBrowser2.Document;
       IHTMLElementCollection coll = (IHTMLElementCollection)html3.getElementsByTagName("frame");
    
       foreach (IHTMLElement el in coll)
       {
        textBox1.Text += ((HTMLFrameElement)el).contentWindow.document.body.title + " " + "\r\n" + ((HTMLFrameElement)el).contentWindow.document.body.innerText + " " + "\r\n" + GetTextFromHtml(((HTMLFrameElement)el).contentWindow.document.body.outerHTML);
       }
    

     

    • Помечено в качестве ответа Abolmasov Dmitry 29 декабря 2010 г. 14:20
    29 декабря 2010 г. 9:39

Все ответы

  • а как вы хотите чтоб оно тоскалось, эт ж просто контрол, а не окно

    либо кладите его, например, на панель (панель на форме) и описывайте таскание панели с помощью mousedown, -up, -move,

    либо сделайте каждый axWebBrowser в новой вкладке в tabControle (когда-то даже тут был пример кажется),

    либо сделайте mdi формы, а в них показывайте свои браузеры-контролы, тогда окна будут таскаться сами:)

    21 декабря 2010 г. 13:34
  • Я не хочу, чтобы они таскались.Вы наверное подумали, что под словами "поменять его расположение" я имею ввиду менять мышкой.  Нет этого не требуется. 

    Как сделать чтобы перехватывалось новое открываемое окно и это окно должно открываться в браузере формы. Вот тот пример в первом посте почти это делает, но отображается оно  не правильно. Видна только верхняя левая часть документа .

    Пытался менять свойство Location

     axWebBrowser2.Location = webBrowser1.Location;

    , но результатов это не принесло. 

    21 декабря 2010 г. 13:50
  • закоментьте присваивание родителя, ведь, присвоив родителя для axWebBrowser2, за границами родителя его не будет видно ж

    21 декабря 2010 г. 14:01
  • Это понятно, но не получается изменить расположение на форме. Браузер открывается окно, где-то посередине формы. 
    22 декабря 2010 г. 8:15
  • Как распположить на форме разобрался. Но возникла другая проблема. Получить Dom html из этого второго браузера не получается. В чем может быть причина.

    Вот здесь новое окно отображаем во втором браузере

    private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
      {
       axWebBrowser2.RegisterAsBrowser = true;
       e.ppDisp = axWebBrowser2.Application;
      }
    

    Теперь пытаюсь получить DOM Html документа, который был загружен во второй браузер

     private void button1_Click_2(object sender, EventArgs e)
        {
          IHTMLDocument2 HTMLDocument = (IHTMLDocument2)axWebBrowser2.Document;
          IHTMLElement body = HTMLDocument.body;
          string dom = body.outerHTML;
    
    
          StreamWriter sw = new StreamWriter(@"C:\bodyc.txt");
          sw.WriteLine(body.outerHTML);
          sw.Close();
          
        }
    

    Подозреваю, что DOM берется из первого браузеа. 

    Что нужно, чтобы все заработало ???

    22 декабря 2010 г. 10:04
  • Подозреваю, что DOM берется из первого браузеа.

    Подозреваете или оно так и есть на самом деле?

     

    Насколько я понял, у вас есть браузер компонент, при событии нового окна вы показываете его в другом браузере на той же форме

    Посмотрите следующий пример (на форме есть 2 обычный webbrowser)

        private void Form1_Shown(object sender, EventArgs e)
        {
          SHDocVw.WebBrowser_V1 Web_V1 = (SHDocVw.WebBrowser_V1)this.webBrowser1.ActiveXInstance;
          Web_V1.NewWindow += new SHDocVw.DWebBrowserEvents_NewWindowEventHandler(Web_V1_NewWindow);
        }
    
        private void Web_V1_NewWindow(string URL, int Flags, string TargetFrameName, ref object PostData, string Headers, ref bool Processed)
        {
          Processed = true; // Прерываем открытие нового окна
    
          // Показывае новое окно во 2ом браузере
          this.webBrowser2.Navigate(URL);
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          MessageBox.Show(webBrowser2.DocumentText); // html нового окна окна
        }
    


    Для связи [mail]
    22 декабря 2010 г. 21:48
  • mshtml.HTMLDocument htmlDocument = (mshtml.HTMLDocument)axWebBrowser2.Document;
    mshtml.HTMLBody htmlBody = (mshtml.HTMLBody)htmlDocument.body;
    string dom = htmlBody.outerHTML;
    
    
    берется из второго окна (подключить reference на Microsoft HTML Object Library из COM)
    23 декабря 2010 г. 6:26
  •  Возникает ошибка когда выполняется javascript на странице (((.

    Думаю нужно искать дугой подход (возможно переходить на ASP.NET).

    Но все равно большое спасибо за помощь. 

    23 декабря 2010 г. 8:37
  • Какая именно ошибка? Не могли бы привести пример той html страницы, которая не хочет работать, чтобы было с чем разбираться?
    Для связи [mail]
    23 декабря 2010 г. 9:16
  • Дело вот в чем Есть дистанционный курс (если это о чем-то говорит). Он состоит из множества html документов вот пример такого документа:

    <HTML>
    <HEAD>
    <TITLE>IBM ELS Knowledge Player</TITLE>
    <script language=Javascript1.2>
    var isNetscape=(document.layers);var isIE=(document.all);var Ll=new Array("Windows 95","Windows NT","Windows 98");var Zo=new Array("WinNT","Win95","Win98","Windows NT 5.0");var ap=new Array("4.72");var Ml=new Array("4.01|SP2","5.01|0");var detect=("".toLowerCase()=="true");var errMsg="";var exitOnErr=("".toLowerCase()=="true");var usesNewWindow=("True".toLowerCase()!="false");var isPublishMode=("publish".toLowerCase()=="publish");var launchURL="system.htm";var courseWindowWidth=getValidInteger("790",781);var courseWindowHeight=getValidInteger("590",541);var navigationFrameSize=getValidInteger("0",0);var navigationFramePosition="Bottom";var navigationFrameScrolling="No";var contentFrameScrolling="No";var browsers=new Array("", "Mozilla/4.72 [en] (WinNT; U)", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT)", "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT)", "Mozilla/4.72 [en] (Win95; I)", "Mozilla/4.0 (compatible; MSIE 5.01; Windows 95)", "Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)", "Mozilla/4.0 (compatible; MSIE 5.01; Windows 98)", "Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)", "Mozilla/4.72 [en] (Windows NT 5.0; I)", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)", "Mozilla/4.0 (compatible; MSIE 4.01; Windows NT 5.0)", "Mozilla/4.72 [en] (Win98 ; U)", "Mozilla/4.72 [en] (WinNT; I)", "Mozilla/4.75 [en] (Win95; U)", "Mozilla/4.75 [en] (WinNT; U)", "Mozilla/4.75 [en] (Windows NT 5.0; U)", "Mozilla/4.0 (compatible; MSIE 5.5; Windows 95)", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0)", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)", "Mozilla/4.75 [en] (Win98; U)", "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)", "Mozilla/4.75 [en] (Win98 ; U)", "Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)", "Mozilla/4.72 [en] (Win95; U)", "Mozilla/4.51 [en] (Win95; U)", "Mozilla/4.7 [en] (Win95; U)", "Mozilla/4.75 [en] (Windows NT 5.0; U)", "Mozilla/4.75 [en]C-CCK-MCD (Windows NT 5.0; U)", "Mozilla/4.72 [en] (Windows NT 5.0; U)", "Mozilla/4.72 [en] (Windows NT 5.0; I)", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)", "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; T312461)");var historyBack=("False".toLowerCase()=="true");function loadPage(){
    if(detect&&!isSupportedBrowser()){
    alert(errMsg);if(!exitOnErr)startCourse();}
    else
    startCourse();}
    function startCourse(){
    posX=((screen.width-courseWindowWidth)/2)-6;posY=((screen.height-courseWindowHeight)/2)-15;if((screen.width-courseWindowWidth)<=10)posX=0;if((screen.height-courseWindowHeight)<=50)posY=0;if(usesNewWindow){
    if(window.opener==null){
    win=window.open("","courseWindow",'"resizable=true,toolbar=yes,location=no,directories=no,status=yes,menubar=no,scrollbars=no,left='+posX+',top='+posY+',width='+courseWindowWidth+',height='+courseWindowHeight+'"');if(historyBack){
    window.history.back();}
    win.document.write(buildFrameSet());win.document.close();win.focus();}
    else
    document.write(buildFrameSet());}
    else
    document.write(buildFrameSet());}
    function isSupportedBrowser(){
    var foundBR=false;for(var i=1;i<browsers.length;i++){
    if(browsers[i].indexOf(navigator.appVersion)!=-1){
    foundBR=true;break;}
    }
    return(foundBR);}
    function buildFrameSet(){
    var myURL=(this.location.toString());if(isPublishMode&&myURL.indexOf("?")!=-1){
    var argStr=myURL.substring(myURL.indexOf("?"),myURL.length);if(argStr!=null&&argStr!="")launchURL+=argStr;}
    var navigationFrame='<FRAME name="navigation" border=0 scrolling="'
    +navigationFrameScrolling+'" src="../templates/blank.htm" marginheight=0 marginwidth=0 noresize FRAMEBORDER=0>';var contentFrame='<FRAME name="content" src="../templates/splash.htm" border=0 scrolling="'
    +contentFrameScrolling+'" src="../templates/blank.htm" marginheight=0 marginwidth=0 noresize FRAMEBORDER=0>';var engineFrame='<FRAME name="engine" src="'+launchURL+'" border=0 scrolling="no" marginheight=0 marginwidth=0 noresize FRAMEBORDER=0>';var controlFrame='<FRAME name="control" border=0 scrolling="no" src="../templates/blank.htm" marginheight=0 marginwidth=0 noresize FRAMEBORDER=0>';var twoFrames='';var frameSetSize='';if(navigationFrameSize==0)navigationFramePosition="bottom";switch(navigationFramePosition.toLowerCase()){
    case "left":
    twoFrames=navigationFrame+contentFrame;frameSetSize='cols='+getFramePercentage(navigationFrameSize,courseWindowWidth-navigationFrameSize);break;case "right":
    twoFrames=contentFrame+navigationFrame;frameSetSize='cols='+getFramePercentage(courseWindowWidth-navigationFrameSize,navigationFrameSize);break;case "top":
    twoFrames=navigationFrame+contentFrame;frameSetSize='rows='+getFramePercentage(navigationFrameSize,courseWindowHeight-navigationFrameSize);break;case "bottom":
    default:
    twoFrames=contentFrame+navigationFrame;frameSetSize='rows='+getFramePercentage(courseWindowHeight-navigationFrameSize,navigationFrameSize);break;}
    var htmlCode='<HTML><TITLE>Программные средства и технологии IBM WebSphere MQ</TITLE><META HTTP-EQUIV="Content-Type" Content="text/html; CHARSET=Windows-1251">'
    +'<FRAMESET '+frameSetSize+' BORDER=0 name="main" FRAMESPACING=0 FRAMEBORDER=0>'
    +twoFrames+engineFrame+controlFrame
    +'</FRAMESET></HTML>';return htmlCode;}
    function getFramePercentage(a,b){
    var aPercent=Math.round(100*a/(a+b));if(aPercent==0){
    return '"*,100%,*,*"';}
    else if(aPercent==100)
    return '"100%,*,*,*"';else
    return '"'+aPercent+'%,'+(100-aPercent)+'%,*,*"';}
    function getValidInteger(str,defaultValue){
    var value=parseInt(str);return(value.toString()=="NaN"?defaultValue:value);}
    </script>
    </HEAD>
    <BODY onLoad="loadPage();">
    </BODY>
    </HTML>
    
    

    При открытии этот документ подгружаются (не знаю как правильно сказать) еще документы, которые также содержат javascript. 

    Сообщение об ошибке такое (если   посмотреть в отладчике). 

    Ошибка выполнения Microsoft JScript: Требуется объект

    Строка, где возникла ошибка (весь документ выше):

     win.document.write(buildFrameSet());
    

    Соответвенно работа программы прерывается и показывается просто форма с пустыми компонентами.

    Вот в этом топике я уже говорил какая задача стоит(может так будет более понятнее) : http://social.msdn.microsoft.com/Forums/ru-RU/fordesktopru/thread/3486fa25-39f4-444e-9c5c-46ba4db63506 

    23 декабря 2010 г. 10:30
  • Ну да, правильно, скрипт падает из-за того, что нету вспылывающего окна

    win=window.open(...)

    Т.к. не создается это окно, то win неопределен и следовательно дальшейший javascript упадет. Т.е. он как раз и падает:

    win.document.write(buildFrameSet());win.document.close();win.focus();

    Даже незнаю, что придумать в этой ситуации можно, окно должно быть, иначе javascript работать небудет. Или придется javascript переписывать...


    Для связи [mail]
    24 декабря 2010 г. 22:27
  • Здравствуйте.  Скрипт не много исправил - убрал win=window.open(...) и написал document.write(buildFrameSet());

    теперь все открывается в одном окне, но нужный DOM получить все равно не получается. Возвращается почему-то html код сформированный данным скриптом (функция buildFrameSet()). Может надо как-то по другому брать DOM ???

    25 декабря 2010 г. 15:57
  • Проблема решена следующим способом:

     

     private void axWebBrowser1_NewWindow2(object sender, AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
     {
      axWebBrowser2.RegisterAsBrowser = true;
      e.ppDisp = axWebBrowser2.Application;
     }
    
     private void axWebBrowser2_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
     {
      axWebBrowser2.Location = new Point(569, 12);
      axWebBrowser2.Size = new Size(600, 500);
     }
    

     

    Теперь второе окно будет открываться в форме (тем самым как бы затирая первый axWebbrowser1) с указанными размерами и расположением на форме.

    Может есть более элегантный способ ??  

    необходимый DOM можно извлечь так (правда я в нем мало что понимаю, так как описания mshtml библиотеки найти не удалось)

       
       IHTMLDocument3 html3 = (IHTMLDocument3)axWebBrowser2.Document;
       IHTMLElementCollection coll = (IHTMLElementCollection)html3.getElementsByTagName("frame");
    
       foreach (IHTMLElement el in coll)
       {
        textBox1.Text += ((HTMLFrameElement)el).contentWindow.document.body.title + " " + "\r\n" + ((HTMLFrameElement)el).contentWindow.document.body.innerText + " " + "\r\n" + GetTextFromHtml(((HTMLFrameElement)el).contentWindow.document.body.outerHTML);
       }
    

     

    • Помечено в качестве ответа Abolmasov Dmitry 29 декабря 2010 г. 14:20
    29 декабря 2010 г. 9:39
  • Да все хорошо, главное работает :)

    Я бы только вместо конкатенации строк в текстбокс, сделал их сложение через StringBuilder, а после вывел бы уже результирующую строке в текстбокс или ричтекстбокс.


    Для связи [mail]
    29 декабря 2010 г. 14:19