WebBrowserコントロールを使用するWinformsアプリを作成しました。そのURIを動的に割り当てます。しばらくは問題なく動作しましたが、今は次のメッセージが表示されます。
サポートされていないブラウザを使用しているようです。古いブラウザはセキュリティを危険にさらす可能性があり、速度が遅く、新しいGoogleマップ機能では動作しません。Googleマップにアクセスするには、最新のブラウザに更新する必要があります。
最後の2つの単語はリンクであり、そのリンクをたどると、次のようになります。
現在使用しています... IE 11
さて、WebBrowserコンポーネントはIE 11;どうすれば変更できますか?
私のマシンはブラウザとしてChromeを使用するように設定されています。おそらく、コントロールは現在のブラウザを使用する必要がありますか?それが可能/実現可能かどうかはわかりません。
さて、私はRezaの提案を試してみるつもりです。しかし、regeditで指定された場所に移動し、右ペインを右クリックして新しいエントリを追加すると、次の3つのオプションがあります。
キー、文字列値、バイナリ値
文字列値は「.exe」文字列であり、バイナリ値は「dword」値であると思いますが、「Key」値はどうあるべきですか?
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
と入力します。
上記の手順では、IE11エッジモードを意味する11001
を使用しました。
新しい Windowsフォーム用のWebViewCompatibleコントロール を使用することもできます。ここで使用する簡単な手順を確認できます。 WebBrowserコントロールをWindowsフォーム用の新しいWebView互換コントロールに置き換えます 。
WebViewCompatible
は、2つのレンダリングエンジンのいずれかを使用して、より広範なWindowsクライアントのセットをサポートします。
Windows 10デバイスでは、新しいMicrosoft Edgeレンダリングエンジンを使用して、リモートWebサーバー、動的に生成されたコード、またはコンテンツファイルからリッチフォーマットされたHTMLコンテンツをレンダリングするビューを埋め込みます。
古いバージョンのWindowsを実行しているデバイスでは、System.Windows.Controls.WebBrowserが使用され、InternetExplorerのエンジンベースのレンダリングが提供されます。
ページのhtmlコンテンツにアクセスでき、コンテンツを変更できる場合(たとえば、ローカルhtmlファイルであるか、サイトが自分のものである場合)、次のように設定できます X-UA-Compatibile
= head
のメタタグ:<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
。
CefSharp
のような他のブラウザコントロールに頼ることができます。
アプリケーションに埋め込まれたカスタムプロトコルの場合、アプリケーションが提供するページの閲覧のみを許可し、外部からのコンテンツは許可しないため、Windowsレジストリへの保存をスキップしたいと思いました。 Reza Aghaeiの回答に従ってテストしたところ、コンテンツページ内から互換モードを変更できることがわかりました。これにより、レジストリキーを構成する必要がなくなりますが、すべてのページに追加する必要があります。
ページの互換モードを変更するには、レンダリングエンジンによって適用されるメタタグを追加する必要があります。
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
</head>
<body>
...
</body>
</html>
以下の手順により、正しいキーが追加され、再度削除されます。 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
C#WebBrowserクラスは、基本的にIEラッパーであるため、変更できません。
this link:を参照してください。
WebBrowserコントロールは、InternetExplorerとともにインストールされたコンポーネントのマネージラッパーです。
代替案については、チェックアウトすることができます