FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WebBrowserコントロールでXButtonを押した際に「戻る」「進む」を行う

 WebBrowserコントロールを使うことで簡易型のブラウザを簡単に作ることができます。
 「戻る」や「進む」といった機能もWebBrowserコントロールから提供されているので、あとは戻るボタン等を作るだけでブラウザを作ることができます。
 ショートカットも定義済みの様で、「Alt + Left」で「戻る」、「Alt + Right」で「進む」が実行されます。
 色々やってくれて気が利いてると思うでしょうが、落とし穴もあります。
 WebBrowserコントロールではマウスボタンが押された等のイベントを補足できません。また、WebBrowserでイベントが終了するのでWebBrowser以下の場所でイベントを補足することもできません。
 ウェブブラウザを使う方ならマウスの横ボタン(XButton)で「戻る」や「進む」を行うことが多いと思います。
 このXButtonはマウスによってあったりなかったりするので標準機能ではありません。そのため、WebBrowserのショートカットにも組み込まれていません。
 通常ならMouseUpやMouseDownイベントでXButtonが押されたかどうかをチェックして処理を行うところですが、WebBrowserコントロールではイベントを補足できないのでこの方法が使えません。
 そこで、HotKeyを設定する方法で使用した方法を利用してXButtonが押されていることを把握してみようと思います。
 以下のコードは、XButton1で「戻る」、XButton2で「進む」を行うビヘイビアのコードです。
using System.Windows.Controls;
using System.Windows.Interactivity;
using System.Windows.Interop;

namespace WpfExtensions.WebBrowsing.Behaviors
{
    /// <summary>
    /// WebBrowserでマウスのXButtonを使って「戻る」、「進む」を実行するためのビヘイビア
    /// </summary>
    public class WebBrowserXButtonNavigationBehaviors : Behavior<WebBrowser>
    {
        /// <summary>
        ///  XButton1又はXButton2を離した際のメッセージ
        /// </summary>
        private const int WM_XBUTTONUP = 0x020C;

        /// <summary>
        /// XButton1を押した場合の値
        /// </summary>
        private const int XBUTTON1 = 0x10000;

        /// <summary>
        /// XButton2を押した場合の値
        /// </summary>
        private const int XBUTTON2 = 0x20000;

        protected override void OnAttached()
        {
            base.OnAttached();
            ComponentDispatcher.ThreadPreprocessMessage += ComponentDispatcher_ThreadPreprocessMessage;
        }

        protected override void OnDetaching()
        {
            ComponentDispatcher.ThreadPreprocessMessage -= ComponentDispatcher_ThreadPreprocessMessage;
            base.OnDetaching();
        }

        void ComponentDispatcher_ThreadPreprocessMessage(ref MSG msg, ref bool handled)
        {
            if(msg.message == WM_XBUTTONUP)
            {
                var wParam = msg.wParam.ToInt32();

                // 戻る
                if(AssociatedObject.CanGoBack && wParam == XBUTTON1)
                {
                    AssociatedObject.GoBack();
                }

                // 進む
                if(AssociatedObject.CanGoForward && wParam == XBUTTON2)
                {
                    AssociatedObject.GoForward();
                }
            }
        }
    }
}
 HotKeyの時と同じ方法でXButtonが押されたかどうかを把握しています。
 このページによると、XButtonがUpした際のメッセージは[0x020C]となります。
 どのXButtonが押されたかはwParamの値で判断できますが、このページの値を使用してもうまくいきませんでした。
 XButton1、XButton2が押された際のwParamの値をMessageBoxで表示させて調べたところXButton1が押されたときは[0x10000]、XButton2が押されたときは[0x20000]になるようです。
 あとは、押されたボタンに合わせて「戻る」又は「進む」の処理を行うだけです。
 「戻る」が可能かどうかはWebBrowserコントロールのCanGoBackプロパティで確認できます。必ず、この値を確認し「戻る」が可能な場合のみGoBackメソッドを呼ぶようにしてください。戻れないときにGoBackメソッドを実行すると例外が発生します。
 これは「進む」の場合も同様です。

 このビヘイビアを使用する場合は以下の様にWebBrowserにアタッチするだけです。
<WebBrowser Source="https://www.google.co.jp/?gws_rd=ssl">
    <i:Interaction.Behaviors>
        <ex:WebBrowserXButtonNavigationBehaviors/>
    </i:Interaction.Behaviors>
</WebBrowser>
 これで、XButtonを使って「戻る」「進む」が可能なブラウザになります。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

カレンダー
11 | 2018/12 | 01
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
全記事表示リンク

全ての記事を表示する

カテゴリ
タグリスト

月別アーカイブ
11  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09 
最新記事
リンク
最新コメント
検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。