none
vb.net Webbrowserコントロールに対してキーボード入力できるようにしたい RRS feed

  • 質問

  • Visual Studioでvb.netの画面を作っております。
    画面にWebbrowserコントロールを貼り付けて、HTML形式の文章を作成、編集できるようにしたいと考えております。

    そのため、下記のソースをプログラム内に組み込みました。

    Dim _doc As mshtml.IHTMLDocument2
    _doc = DirectCast(WEBBROWSER1.Document.DomDocument, mshtml.IHTMLDocument2)
    _doc.designMode = "On"

    ここではWebbrowserコントロールの名前をWEBBROWSER1としております。
    デバッグしたところdesignMode = "On"は設定されているのですが、
    Webbrowserコントロールに対してキーボードからの文字入力ができません。
    ツールバーを作成し、プログラムから挿入した文章に対して文字の大きさを変えたり、
    色をつけたり位置を変えたりはできるのですが、
    何をすればキーボードからの文字入力ができるようになるか
    試すアイデアをいただけないでしょうか?

    最終的にはWindowsServer2012R2環境で動作させたいのですが、
    デバッグ環境はWindows7環境で動作確認しております。
    現在はともにキーボード入力はできません。
    urlはabout:blankを表示して、Documenttextに対してサンプル文章をプログラムから設定して表示はしております。
    ネットにアクセスしてwebページをすることはありません。

    これまでに、
    ・C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dllがあることは確認しました。
    ・レジストリHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION、
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATIONに
      作成したモジュールを登録し、IEのバージョンを色々変更してみました。

    宜しくお願いいたします。

    2019年4月9日 6:35

回答

  • 皆さまご協力ありがとうございました。

    いただいた情報をもとに設定変更等してみたのですが解決に至らず、困っておりましたが、
    職場の技術者から.NetでもIEでもなくHTMLの観点から解決策をいただきました。
    以下の方法で入力ができるようになったので解決策の一つとして共有しておきます。
    何らかの設定、セキュリティによって上記のシンプルなwebbrowserコントロールでDesignModeをOnにしても
    自動的にInheritに変わってりキーボード入力を受け付けなくなってしまう場合、DocumentTextに
    設定するHTML文のBodyの属性か、Bodyの内側にDivの属性を使用して編集できるように設定できる。

    wbHtml.DocumentText = "<html><head></head><body contenteditable=""true""></body></html>"

    または

    wbHtml.DocumentText = "<html><head></head><body><div contenteditable=""true""></div></body></html>"

    で本文として内容を編集できるようになる。
    ただし、この設定で編集できるようになっても編集後の本文はDocumentTextのプロパティからは取得できないことがある。
    その場合はwbHtml.Document.Body.InnerText、wbHtml.Document.Body.InnerHtmlのいずれかのプロパティから
    修正後の値を取得する必要がある。

    今回の私の問題はこのHTML文の属性contenteditableを使用してキーボード入力ができるようにして、問題の解決をしました。
    皆さまご協力ありがとうございました。

    • 回答としてマーク 柚穐 2019年4月26日 14:22
    2019年4月26日 14:22

すべての返信

  • 理由までは調べていなくて申し訳ないですが、デザインモードにしたあと、DocumentText プロパティへ値を代入すると編集できなくなります。
    なので、
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim _doc As mshtml.IHTMLDocument2
        WebBrowser1.DocumentText = "<html><head></head><body></body></html>"
        _doc = DirectCast(WebBrowser1.Document.DomDocument, mshtml.IHTMLDocument2)
        _doc.designMode = "On"
    End Sub
    
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
        WebBrowser1.Document.Body.InnerText = "編集できます"
    End Sub

    のような感じにしてやるとうまくいきます。

    2019年4月9日 13:10
  • 情報提供ありがとうございます。

    いただいた情報を元に動作させたいプログラムのLOADのイベントの関数内でDocumentTextにセットしてからdesignModeをOnにしてみました。

    デバッグではDocumentTextにセットしても次のステップでは変化は無く、designModeをOnにした後に<head></head>の情報だけがDocumentTextに登録され、Document.BodyはNothingで処理が進みました。

    動作させたいプログラムではShown以外のところのBottun_ClickでInnerTextに値を入れようとしたところ、BODYがNothingだったため、InnerTextに値が挿入できませんでした。

    変わりにDocumentTextをセットする前にdesignModeを”Off”にしてさDocumentTextをセットする後にdesignModeを”On”にしてみましたが、サンプルの文章は表示できるのですが、Webbrowserコントロールへの文字のキーボード入力はできませんでした。

    動作させたいプログラムをおいておいてシンプルに上のソースのForm1_Shownをbuttun_Clickの関数に変えClickイベントでInnerText を挿入するプログラム(下記がそのソース)を作ってデバッグ、通常実行しましたが、ボタン押下前も後もWebbrowserコントロールへのキーボードからの文字入力はできませんでした。

    Public Class Form1
        Private Sub btnSetSample_Click(sender As Object, e As EventArgs) Handles btnSetSample.Click
            Try
                wbHtml.Document.Body.InnerText = "編集できます"
    
            Catch ex As Exception
                Throw ex
            End Try
        End Sub
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Try
                Dim _doc As mshtml.IHTMLDocument2
                wbHtml.DocumentText = "<html><head></head><body></body></html>"
                _doc = DirectCast(wbHtml.Document.DomDocument, mshtml.IHTMLDocument2)
                _doc.designMode = "On"
    
            Catch ex As Exception
                Throw ex
            End Try
        End Sub
    End Class

    • 編集済み 柚穐 2019年4月10日 7:36
    2019年4月10日 5:35
  • ご提示のコードを貼り付けて実行してみましたが、何の問題もなく動いてしまいました。

    環境は Windows 7、Visual Studio 2017 Professional

    念のため .NET Framework は 3.5、4.0、4.5、4.5.2 と変えて確認しています。

    ひょっとしたら IE の設定なのかもしれませんね。


    2019年4月10日 8:47
  • ありがとうございます。

    こちらも、一部の環境で動作することを確認しました。

    実際に動かしたい環境では全く入力できるようにならないので

    Visual Studioの開発ソースの問題ではなく、環境の設定のようだと私の方でも思っていましたが、

    やはり、同じような見解をいただけたようでこちらの考えも固まりました。

    もう一つのフォーラムの方に問いかけて何か知らないか

    情報を集めてみようかと思います。

    調査いただきありがとうございました。

    2019年4月10日 11:50
  • 柚穐 さま よろしく。

    確か Server と Client とで、WebBrowser の挙動が違う様に構成されていた筈です。
    Server では、制限事項が多かったので、セキュリティ強化の構成を外すなどが話題として取り上げられます。
    可否は兎も角、その辺りもご確認を。

    参考:
    https://support.microsoft.com/ja-jp/help/815141/ie-enhanced-security-configuration-changes-browsing-experience

    2019年4月10日 15:30
  • 貴重な情報ありがとうございます。

    参考にして今の動かない環境に対してセキュリティの変更をして確認してみます。

    確認したら結果を報告させていただきます。

    2019年4月11日 12:49
  • とりあえず、一旦報告です。

    紹介いただいたサイトに記載されていた2点を確認しました。

    ・信頼性サイトについて編集できない環境でabout:blankを登録しても動作しませんでした。

    ・インターネットオプションの詳細設定のブラウザのチェックをそれぞれチェック有、チェック無で編集できない環境で試しましたが、これも入力できない状態でした。

    そのほか簡易エディタでボタンでwebbrowserに”編集できます”を表示しますが、そこにdesignModeの値を表示するように編集したところ、編集できる環境では”On"、編集できない環境では"Inherit"が出力されました。

    ソースでは変更する処理を組み込んでいませんし、同じExeをコピーして動作させただけで、デバッグしていてもLoadのイベント完了まではOnのままであることはウォッチしてましたので、Loadイベント終了後に環境によってフラグが書き換えられたことがわかりました。

    環境に影響された処理を追加で調べないといけないのですが、暗礁に乗り上げた感じです。

    以上が協力いただけた方への状況報告です。

    2019年4月17日 9:19
  • 柚穐 さま 拝見しました。

    ご質問の趣旨から離れてしまうので、書くのを躊躇っていたのですが、
    TextBox と WebBrowserControl の2ペイン構成にするのは問題があるのでしょうか?。
    詰まる所、VSCode や VS の様な構成(ソース+表示 独立)をお考えになっては?。
    2019年4月17日 9:45
  • ご意見ありがとうございます。

    すでに似た感じにはなっています。

    すでに別の環境では動作していたメール本文を作成する機能で、Text形式の本文を入力するペインとHTML形式の本文を入力するペインがあります。

    問題として調査しているのがHTML形式の本文を入力するペインの本文のキーボード入力ができないことを調査しております。

    連動しているのでText形式で入力すればフォント情報を捨てた本文の内容がHTML形式のペインに反映はされます。

    ただ、メールを書く側からすれば、HTML形式のペインで何で入力できないのかとなり、調査している次第です。

    別の環境では動作していたのです。

    OutLook等ではHTML形式で本文入力できるのに、上記のソースの簡易エディタではHTML本文の入力ができないのです。

    メール本文入力として機能させたいので、強制的に永続的にPG動作中はDesignModeをOnにする方法を探している次第です。

    現状、特定の環境では、(私の職場の環境のほぼ90%で)Loadイベント処理時はOnにできてもイベント終了後はフラグが戻っているので困っています。

    ご意見いただきありがとうございました。


    • 編集済み 柚穐 2019年4月17日 15:46
    2019年4月17日 15:45
  • 皆さまご協力ありがとうございました。

    いただいた情報をもとに設定変更等してみたのですが解決に至らず、困っておりましたが、
    職場の技術者から.NetでもIEでもなくHTMLの観点から解決策をいただきました。
    以下の方法で入力ができるようになったので解決策の一つとして共有しておきます。
    何らかの設定、セキュリティによって上記のシンプルなwebbrowserコントロールでDesignModeをOnにしても
    自動的にInheritに変わってりキーボード入力を受け付けなくなってしまう場合、DocumentTextに
    設定するHTML文のBodyの属性か、Bodyの内側にDivの属性を使用して編集できるように設定できる。

    wbHtml.DocumentText = "<html><head></head><body contenteditable=""true""></body></html>"

    または

    wbHtml.DocumentText = "<html><head></head><body><div contenteditable=""true""></div></body></html>"

    で本文として内容を編集できるようになる。
    ただし、この設定で編集できるようになっても編集後の本文はDocumentTextのプロパティからは取得できないことがある。
    その場合はwbHtml.Document.Body.InnerText、wbHtml.Document.Body.InnerHtmlのいずれかのプロパティから
    修正後の値を取得する必要がある。

    今回の私の問題はこのHTML文の属性contenteditableを使用してキーボード入力ができるようにして、問題の解決をしました。
    皆さまご協力ありがとうございました。

    • 回答としてマーク 柚穐 2019年4月26日 14:22
    2019年4月26日 14:22