[C# Webbrowser] BackSpaceキーによる戻る機能を制御

C#でWebbrowserコントロールを使ったアプリ制作は色々とハマるポイントがあります。

今回は、BackSpaceキーによる「戻る」機能を制御(抑制)する方法を紹介します。

制御のポイントは以下のとおりです。

・Webbrowserコントロールで画面遷移をキャンセルしてもダメ
→ JavaScriptで制御すればOK
・input、textareaタグ上では制御しない
→ 入力エリアのBackSpaceキーは使えるように

BackSpaceキーの制御方法

スポンサーリンク

以下の手順で進めます。

  1. BackSpaceキーを制御するための、JavaScriptを用意
  2. 画面読み込み時にJavaScriptを埋め込む

BackSpaceキーを制御するための、JavaScriptを用意

まずは、BackSpaceキーを制御するための、JavaScriptを用意します。

直接JavaScriptのコードを埋め込みたかったのですが、色々調べた結果、外部ファイルにしないとダメとの事。

ここでは、backspaceControle.jsとします。

内容としては、body要素のkeydownイベントを拾い、入力エリア以外でBackSpaceキーが押されたら、イベントをキャンセルするというものです。

画面読み込み時にJavaScriptを埋め込む

つぎに、Webbrowserが画面を読み込んだ際に、先程のJavaScriptを埋め込みます。

画面読み込み完了時(DocumentCompleted)に、JavaScriptを埋め込むのですが、サイトによっては、DocumentCompletedイベントが何度も走ります。

Navigated → DocumentCompleted → DocumentCompleted という感じです。

何度もJavaScriptを埋め込むのはマズいので、初回だけ埋め込むよう、isFirstで制御しています。

ちなみに、ハイブリットアプリで、自前のページにしかアクセスしないのであれば、わざわざWebbrowser側でJavaScriptを埋め込まなくても、html側だけで対応可能かと思います。

スポンサーリンク

ダメだった方法

BackSpaceキー制御を実装するにあたり、海外サイトで対応方法を模索したところ、WebbrowserコントロールのPreviewKeyDownイベントを使う方法が紹介されてました。

流れ

  1. PreviewKeyDownイベントでBackSpaceキーを検知
  2. Navigatingイベントで画面遷移をキャンセル

という流れなんですが、この方法には一つ落とし穴が。

落とし穴

2で画面遷移をキャンセルする訳ですが、キャンセルしたにも関わらず、Webbrowserの履歴上から「もどる」べきURL情報が消えてしまいます。(戻った事になる)

一見、BackSpaceキーによる「もどる」動作はキャンセルできても、WebbrowserコントロールのGoBack()を使って、「もどる」ことができませんでした。

試したコードは以下のとおりです。

この方法で実現したければ、履歴操作を自前でやる必要がありそうですね。

うーん。。Webbrowserコントロールは便利だけど、色々大変ですね。