トップ回答者
System.Windows.Controls.WebBrowser コントロールに onscroll イベントを探知したい。

質問
-
各位、こんばんは,
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; }
以上、皆さまにお知恵を貸したくて、質問させていただきます。
回答
-
やっと解決しました。
ソースコードを添付します。
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
すべての返信
-
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 )をスクロールする
※画面がスクロールされる
これだけで、画面に何度もクリックしても、スクロールしても、イベントが拾えなくなりました!!!!
その原因がご存知の方がいらっしゃいますか。
-
やっと解決しました。
ソースコードを添付します。
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