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に表示されたページにピンチアウト・ピンチ操作を止める(禁止)方法を教えていただけますか


Sponsored



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も判断条件に追加しました。