Question
icyfire028 on Fri, 18 Nov 2016 14:35:34
現在、WebBrower オブジェクトにJSPのウェブページファイルを表示しています。
表示されたウェブページにCtrlキーを押しながら、「+/-」キーあるいはマウスのWheelキーを押すと、、ページの内容を拡大・縮小することができます。
この行為を止めるために、下記ソースで、制限しています。
public MainWindow() { InitializeComponent(); _webbrowserObj.PreviewKeyDown += ListenWebBrowerKeyEvent; _webbrowserObj.LoadCompleted += _webbrowserObj_LoadCompleted; } // WebBrowser のClickイベント、Mousewheelイベント、Scrollイベントをリスナーする void _webbrowserObj_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) { var wbDoc = (mshtml.HTMLDocument)_webbrowserObj.Document; mshtml.HTMLDocumentEvents2_Event iEvent; iEvent = (mshtml.HTMLDocumentEvents2_Event)wbDoc; iEvent.onmousewheel -= iEvent_onmousewheel; iEvent.onclick -= new mshtml.HTMLDocumentEvents2_onclickEventHandler(ClickEventHandler); iEvent.onmousewheel += iEvent_onmousewheel; 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; } // Ctrl キー + MouseのWheelを止める bool iEvent_onmousewheel(mshtml.IHTMLEventObj pEvtObj) { if (pEvtObj.ctrlKey) { pEvtObj.cancelBubble = true; pEvtObj.returnValue = false; return false; } return true; } // Ctrlキー + [+/-] キーを止める private void ListenWebBrowerKeyEvent(object sender, System.Windows.Input.KeyEventArgs e) { SecondsCounterFor30 = 0; if (e.KeyboardDevice.Modifiers == ModifierKeys.Control) { if (e.Key == Key.OemMinus || e.Key == Key.OemPlus) { e.Handled = true; } } }
上記のソースで、デスクトップ・ノートパソコンでは全く問題ありませんが、
タブレットに移植したら、ピンチアウト・ピンチイン操作で、ページの拡大・縮小がまだ制限されていません。
どなたがタブレットでWebBrowerに表示されたページにピンチアウト・ピンチ操作を止める(禁止)方法を教えていただけますか
Replies
ひらぽん on Fri, 18 Nov 2016 15:02:04
試してませんが、WebBrowser.Document で取得した HTML ドキュメントに、以下のタグを埋め込んでみるのはいかがでしょうか?
<meta name="viewport" content="user-scalable=no">
本フォーラムは、ユーザー(開発者)同士で情報交換を行うためのコミュニティです。初めて利用される方は、以下のアナウンスをご覧ください。 https://social.msdn.microsoft.com/Forums/ja-JP/ca9ecfb7-4407-4fcb-b8bd-207d68257e68?
gekka on Sat, 19 Nov 2016 02:42:58
WebBrowser(の中のウィンドウ)がジェスチャを受け取らないようにしてみる
using System; using System.Collections.Generic; using System.Linq; using System.Windows; using System.Windows.Documents; using System.Runtime.InteropServices; namespace WpfApplication1 { public partial class MainWindow : Window { private System.Windows.Controls.WebBrowser _webbrowserObj; public MainWindow() { InitializeComponent(); _webbrowserObj = new System.Windows.Controls.WebBrowser(); _webbrowserObj.LoadCompleted += _webbrowserObj_LoadCompleted; _webbrowserObj.Navigate(@"https://social.msdn.microsoft.com/Forums/ja-JP/home"); this.Content = _webbrowserObj; } BrowserNativeWindow hookwindow; void _webbrowserObj_LoadCompleted(object sender, System.Windows.Navigation.NavigationEventArgs e) { if (hookwindow == null) { hookwindow = BrowserNativeWindow.Hook(this._webbrowserObj); if (hookwindow != null) { _webbrowserObj.LoadCompleted -= _webbrowserObj_LoadCompleted; } } } } class BrowserNativeWindow : System.Windows.Forms.NativeWindow { private delegate bool EnumWindowsProc(IntPtr hwnd, IntPtr lParam); enum GID : int { ZOOM = 3 } [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); public static List<IntPtr> GetChildWindows(IntPtr hwndParent) { List<IntPtr> list = new List<IntPtr>(); EnumChildWindows(hwndParent, (h, p) => { list.Add(h); return true; }, IntPtr.Zero); return list; } public static BrowserNativeWindow Hook(System.Windows.Controls.WebBrowser browser) {//ウィンドウを見つけるのはちょっと手抜き var host = browser as System.Windows.Interop.HwndHost; IntPtr hwnd = host.Handle; var children = BrowserNativeWindow.GetChildWindows(hwnd); foreach (IntPtr child in BrowserNativeWindow.GetChildWindows(hwnd)) { var target = GetChildWindows(child).FirstOrDefault(); if (target != IntPtr.Zero) { var nw = new BrowserNativeWindow(); nw.AssignHandle(target); return nw; } } return null; } const int WM_GESTURE = 0x0119; protected override void WndProc(ref System.Windows.Forms.Message m) { if (m.Msg == WM_GESTURE && m.WParam.ToInt32() == (int)GID.ZOOM) { return; } base.WndProc(ref m); } } }
icyfire028 on Sat, 26 Nov 2016 05:41:42
ご返信有難うございました。
ご提示頂いたソースで問題を解消できました。
最初ソースの意味が全く分かりませんが、
いろいろ調べて、だんだんわかるようになりました。
勉強になりました。有難うございました。
icyfire028 on Sat, 26 Nov 2016 05:42:19
ご返信、有難うございました。
試してみました。
残念ですが、現象は解消されていなかったんです。
icyfire028 on Mon, 28 Nov 2016 00:41:25
補足です。
m.WParam.ToInt32() == (int)GID.ZOOM だけを判断すると、
たまにできない場合があります。
最後、条件にGIDの6と7も判断条件に追加しました。