none
System.Windows.Controls.WebBrowser コントロールに onscroll イベントを探知したい。 RRS feed

  • 質問

  • 各位、こんばんは,

    icyfireです。

    現在、System.Windows.Control.WebBrowserコントロールを使って、指定Htmlページの内容を表示しています。

    Htmlページにデータが多くなった場合、スクロールが表示されます。

    今、スクロールバーがスクロールされていることを探知したいですが、

    どうすれば、onscroll イベントで探知できるようになりますか?

    既に下記の形で onclick イベントを探知しています。

    void _webbrowser_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {         
       var wbDoc = (mshtml.HTMLDocument)_webbrowser.Document;
       mshtml.HTMLDocumentEvents2_Event iEvent; //Event in the mshtml Document through which mouse events can be raised.
    
       iEvent = (mshtml.HTMLDocumentEvents2_Event)wbDoc;
       iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
    }
    
    private bool ClickEventHandler(mshtml.IHTMLEventObj pEvtObj)
    {
                // イベント処理
                return true;
      }

    以上、皆さまにお知恵を貸したくて、質問させていただきます。

    2016年9月29日 14:20

回答

  • やっと解決しました。

    ソースコードを添付します。

    void wb_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        EventBindingForClickAndScroll();
    }
            
    void EventBindingForClickAndScroll()
    {
        var wbDoc = (mshtml.HTMLDocument)wb.Document;
    
        mshtml.HTMLDocumentEvents2_Event iEvent; 
    
        iEvent = (mshtml.HTMLDocumentEvents2_Event)wbDoc;
        iEvent.onclick -= new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
        iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
    
        // schedule-list:Div ID
        // HTML にあるDIVを取得する
        mshtml.IHTMLDivElement divObj = (mshtml.IHTMLDivElement)wbDoc.getElementById("schedule-list");
        var divEvent = (mshtml.HTMLElementEvents_Event)divObj;
        divEvent.onscroll -= divEvent_onscroll;
        divEvent.onpropertychange -= divEvent_onpropertychange;
    
        divEvent.onscroll += divEvent_onscroll;
        divEvent.onpropertychange += divEvent_onpropertychange;
    }
    
    void divEvent_onpropertychange()
    {
        var wbDoc = (mshtml.HTMLDocument)wb.Document;
        
       if (wbDoc.readyState == "complete")
       {
           EventBindingForClickAndScroll();
       }
    }
    
    void divEvent_onscroll()
    {
        // Do Some Action
        EventBindingForClickAndScroll();
    }
    
    
    private bool ClickEventHandler(mshtml.IHTMLEventObj pEvtObj)
    {
    	// Do Some Action
        return true;
    }

    schedule-list はWebBrowerにロードされたHTMLにDIVコントロールのIDです。

    <body>
            <div id="schedule-list"></div>
    </body>

    スクロールしたら、再度イベントをBindingしてあげることで解決。

    • 回答としてマーク icyfire028 2016年10月1日 11:21
    2016年10月1日 11:20

すべての返信

  • onscroll の問題が解決できました

    下記の通りです。

    <Window x:Class="WebBrowserScrollTest.MainWindow"         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WebBrowserScrollTest"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <WebBrowser x:Name="wb" Source="http://www.yahoo.co.jp/" LoadCompleted="wb_LoadCompleted" />
        </Grid>
    </Window>


    namespace WebBrowserScrollTest
    {
        /// <summary>
        /// MainWindow.xaml の相互作用ロジック
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
    
            private void wb_LoadCompleted(object sender, NavigationEventArgs e)
            {           
                var wbDoc = (mshtml.HTMLDocument)wb.Document;
                mshtml.HTMLDocumentEvents2_Event iEvent; //Event in the mshtml Document through which mouse events can be raised.
    
                iEvent = (mshtml.HTMLDocumentEvents2_Event)wbDoc;
                iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
    
                mshtml.HTMLWindow2 htmlWin = (mshtml.HTMLWindow2)wbDoc.parentWindow;
                var windowEvent = (mshtml.HTMLWindowEvents2_Event)htmlWin;
                windowEvent.onscroll += WindowEvent_onscroll1;
    
            }
    
            private void WindowEvent_onscroll1(mshtml.IHTMLEventObj pEvtObj)
            {
                MessageBox.Show("Onscroll Event!");
            }
    
    
            private bool ClickEventHandler(mshtml.IHTMLEventObj pEvtObj)
            {
                MessageBox.Show("OnClick Event!");
                return true;
            }
    
        }
    }
    

    上記のソースで、初期表示時、スクロールやクリックイベントを発生したら、対応したメッセージを表示されます。(イベントが拾える)

    解決したと思いきや、新しい問題が出てきました。

    ・Yahooの検索ボックスに適当に検索内容を入れて、Enterキーを押す

    ・表示されたページに、マウスの右クリックで検索ボックスにフォーカスを入れて、マウスの真ん中のキー(wheel )をスクロールする

    ※画面がスクロールされる

    これだけで、画面に何度もクリックしても、スクロールしても、イベントが拾えなくなりました!!!!

    その原因がご存知の方がいらっしゃいますか。

    2016年9月30日 6:23
  • やっと解決しました。

    ソースコードを添付します。

    void wb_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        EventBindingForClickAndScroll();
    }
            
    void EventBindingForClickAndScroll()
    {
        var wbDoc = (mshtml.HTMLDocument)wb.Document;
    
        mshtml.HTMLDocumentEvents2_Event iEvent; 
    
        iEvent = (mshtml.HTMLDocumentEvents2_Event)wbDoc;
        iEvent.onclick -= new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
        iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler);
    
        // schedule-list:Div ID
        // HTML にあるDIVを取得する
        mshtml.IHTMLDivElement divObj = (mshtml.IHTMLDivElement)wbDoc.getElementById("schedule-list");
        var divEvent = (mshtml.HTMLElementEvents_Event)divObj;
        divEvent.onscroll -= divEvent_onscroll;
        divEvent.onpropertychange -= divEvent_onpropertychange;
    
        divEvent.onscroll += divEvent_onscroll;
        divEvent.onpropertychange += divEvent_onpropertychange;
    }
    
    void divEvent_onpropertychange()
    {
        var wbDoc = (mshtml.HTMLDocument)wb.Document;
        
       if (wbDoc.readyState == "complete")
       {
           EventBindingForClickAndScroll();
       }
    }
    
    void divEvent_onscroll()
    {
        // Do Some Action
        EventBindingForClickAndScroll();
    }
    
    
    private bool ClickEventHandler(mshtml.IHTMLEventObj pEvtObj)
    {
    	// Do Some Action
        return true;
    }

    schedule-list はWebBrowerにロードされたHTMLにDIVコントロールのIDです。

    <body>
            <div id="schedule-list"></div>
    </body>

    スクロールしたら、再度イベントをBindingしてあげることで解決。

    • 回答としてマーク icyfire028 2016年10月1日 11:21
    2016年10月1日 11:20