web-dev-qa-db-ja.com

WebBrowserコントロールに最新のコンテンツを表示させるにはどうすればよいですか?

WebBrowserコントロールを使用するWinformsアプリを作成しました。そのURIを動的に割り当てます。しばらくは問題なく動作しましたが、今は次のメッセージが表示されます。

サポートされていないブラウザを使用しているようです。古いブラウザはセキュリティを危険にさらす可能性があり、速度が遅く、新しいGoogleマップ機能では動作しません。Googleマップにアクセスするには、最新のブラウザに更新する必要があります。

最後の2つの単語はリンクであり、そのリンクをたどると、次のようになります。

現在使用しています... IE 11

さて、WebBrowserコンポーネントはIE 11;どうすれば変更できますか?

私のマシンはブラウザとしてChromeを使用するように設定されています。おそらく、コントロールは現在のブラウザを使用する必要がありますか?それが可能/実現可能かどうかはわかりません。

更新

さて、私はRezaの提案を試してみるつもりです。しかし、regeditで指定された場所に移動し、右ペインを右クリックして新しいエントリを追加すると、次の3つのオプションがあります。

キー、文字列値、バイナリ値

文字列値は「.exe」文字列であり、バイナリ値は「dword」値であると思いますが、「Key」値はどうあるべきですか?

6
B. Clay Shannon

WebBrowserコントロール

WebBrowser コントロールは、OSにインストールされているものと同じInternet Explorerバージョンを使用しますが、デフォルトでは最新のドキュメントモードを使用せず、互換モードでコンテンツを表示します。

症状-症状として、サイトはInternet Explorerまたは他のブラウザーで正しく機能しますが、WebBrowserコントロールはサイトを適切に表示せず、一部のサイトではスクリプトエラーが表示されます。

解決策-WebBrowserコントロールで、互換モードなしで最新のドキュメントモードを使用するようにWebBrowserコントロールに指示できます。手順 ここ に従って、レジストリを使用して設定を無効にすることができます。 [参照: ブラウザエミュレーション ]

コードを使用してブラウザエミュレーション設定を適用します

コードを使用して設定を適用する場合は、次のコードを1回実行します。

using (var key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(
    @"Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION",
    true))
{
    var app = System.IO.Path.GetFileName(Application.ExecutablePath);
    key.SetValue(app, 11001, Microsoft.Win32.RegistryValueKind.DWord);
    key.Close();
}

上記のコードでは、IE11エッジモードを意味する11001を使用しました。

Internet Explorer 11. Webページは、宣言された!DOCTYPEディレクティブに関係なく、IE11エッジモードで表示されます。 !DOCTYPEディレクティブの宣言に失敗すると、ページがQuirksにロードされます。

ブラウザエミュレーション設定を手動で適用します

レジストリエディタを開き、HKEY_CURRENT_USERを参照して、次のキーに移動します。

Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

次の値を追加します。

"YourApplicationFileName.exe"=dword:00002af9
"YourApplicationFileName.vshost.exe"=dword:00002af9

(古いバージョンのVisual Studioでは、プログラムをVisual Studioで実行するときに、vshost.exe値も追加する必要がありました。)

エントリを作成するには、右ペインの空の領域を右クリックし、dword値を選択した後に表示されるウィンドウで、16進数を選択し、2af9と入力します。

enter image description here

上記の手順では、IE11エッジモードを意味する11001を使用しました。

Windowsフォーム用のWebViewCompatibleコントロールを使用する

新しい Windowsフォーム用のWebViewCompatibleコントロール を使用することもできます。ここで使用する簡単な手順を確認できます。 WebBrowserコントロールをWindowsフォーム用の新しいWebView互換コントロールに置き換えます

WebViewCompatibleは、2つのレンダリングエンジンのいずれかを使用して、より広範なWindowsクライアントのセットをサポートします。

  • Windows 10デバイスでは、新しいMicrosoft Edgeレンダリングエンジンを使用して、リモートWebサーバー、動的に生成されたコード、またはコンテンツファイルからリッチフォーマットされたHTMLコンテンツをレンダリングするビューを埋め込みます。

  • 古いバージョンのWindowsを実行しているデバイスでは、System.Windows.Controls.WebBrowserが使用され、InternetExplorerのエンジンベースのレンダリングが提供されます。

X-UA互換のメタタグを設定する

ページのhtmlコンテンツにアクセスでき、コンテンツを変更できる場合(たとえば、ローカルhtmlファイルであるか、サイトが自分のものである場合)、次のように設定できます X-UA-Compatibile = headのメタタグ:<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

他のブラウザコントロールを使用する

CefSharp のような他のブラウザコントロールに頼ることができます。

20
Reza Aghaei

アプリケーションに埋め込まれたカスタムプロトコルの場合、アプリケーションが提供するページの閲覧のみを許可し、外部からのコンテンツは許可しないため、Windowsレジストリへの保存をスキップしたいと思いました。 Reza Aghaeiの回答に従ってテストしたところ、コンテンツページ内から互換モードを変更できることがわかりました。これにより、レジストリキーを構成する必要がなくなりますが、すべてのページに追加する必要があります。

ページの互換モードを変更するには、レンダリングエンジンによって適用されるメタタグを追加する必要があります。

<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
    </head>
    <body>
    ...
    </body>
</html>
7
jlchavez

以下の手順により、正しいキーが追加され、再度削除されます。 Webブラウザーが存在するフォームをロードするときに、CreateBrowserKeyを呼び出します。次に、フォームを閉じるときに、RemoveBrowserKeyを呼び出します。

Private Sub CreateBrowserKey(Optional ByVal IgnoreIDocDirective As Boolean = False)
    '      Dim basekey As String = Microsoft.Win32.Registry.CurrentUser.ToString
    Dim value As Int32
    '       Dim thisAppsName As String = My.Application.Info.AssemblyName & ".exe"

    ' Value reference: http://msdn.Microsoft.com/en-us/library/ee330730%28v=VS.85%29.aspx
    ' IDOC Reference:  http://msdn.Microsoft.com/en-us/library/ms535242%28v=vs.85%29.aspx
    Select Case (New WebBrowser).Version.Major
        Case 8
            If IgnoreIDocDirective Then
                value = 8888
            Else
                value = 8000
            End If
        Case 9
            If IgnoreIDocDirective Then
                value = 9999
            Else
                value = 9000
            End If
        Case 10
            If IgnoreIDocDirective Then
                value = 10001
            Else
                value = 10000
            End If
        Case 11
            If IgnoreIDocDirective Then
                value = 11001
            Else
                value = 11000
            End If

        Case Else
            Exit Sub
    End Select
    Microsoft.Win32.Registry.SetValue(Microsoft.Win32.Registry.CurrentUser.ToString & BrowserKeyPath, _
                                              Process.GetCurrentProcess.ProcessName & ".exe", _
                                              value, _
                                              Microsoft.Win32.RegistryValueKind.DWord)
End Sub

Private Sub RemoveBrowserKey()
    Dim key As Microsoft.Win32.RegistryKey
    key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(BrowserKeyPath.Substring(1), True)
    key.DeleteValue(Process.GetCurrentProcess.ProcessName & ".exe", False)
End Sub
2
John

C#WebBrowserクラスは、基本的にIEラッパーであるため、変更できません。

this link:を参照してください。

WebBrowserコントロールは、InternetExplorerとともにインストールされたコンポーネントのマネージラッパーです。

代替案については、チェックアウトすることができます

WebKit.NET

GeckoFX

1
Daniel