deXo-fan Ответов: 1

Проблема с этим .NET webbrowser и реестр


Привет,

Я знаю, что подобные проблемы уже были размещены здесь раньше. Я знаю это, потому что искал на этом сайте решения, но те, которые я нашел, не сработали для меня.

У меня проблема с управлением веб-браузером. Прямо сейчас он отображает страницы, как старая версия Internet Explorer. Мне нужно, чтобы он отображал их так, как это сделали бы Microsoft Edge или Chrome. Некоторые из решений, которые я нашел для других версий той же проблемы, включают вставку HTML-тега. Это не сработало для меня.

Другое решение, которое, кажется, делает трюк для многих людей, состоит в том, чтобы создать значение в базе данных реестра с именем вашего приложения (например, myApp.exe) и целочисленное значение, представляющее, какую версию Internet Explorer вы хотите, чтобы элемент управления веб-браузером вел себя как - десятичное значение 10001, по-видимому, является Edge, а 8888 и 9999-самыми последними версиями Internet Explorer.

Именно тогда я написал этот код, который до сих пор не работает. Согласно одному веб-сайту, чей url я собираюсь предоставить, член JavaScript document.documentMode должно быть равно 11 для Edge, когда он работает (то есть когда элемент управления веб-браузером ведет себя как Edge из-за значения 10001 в базе данных реестра). Излишне говорить, что здесь documentMode установлен на 5, как будто он полностью игнорирует значения реестра, которые я установил. Я создал как относительные, так и абсолютные пути к моему EXE (отладочная сборка Visual Studio) как в 32-разрядной, так и в 64-разрядной частях regedit, а также в HKEY_CURRENT_USER и HKEY_LOCAL_MACHINE. Мне не разрешалось прикасаться к последнему с помощью C#. Запуск моего приложения без прав администратора вызвал исключение; с правами администратора он просто проигнорировал мою попытку создать значение в HKEY_LOCAL_MACHINE.

Это код, который я написал:

public partial class MainForm : Form
{
	const string regValue32cu = @"HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
	const string regValue64cu = @"HKEY_CURRENT_USER\Software\wow6432node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
	const string regValue32lm = @"HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";
	const string regValue64lm = @"HKEY_LOCAL_MACHINE\Software\wow6432node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION";

	const uint value = 10001U;

	public MainForm()
	{
		InitializeComponent();
	}

	private void MainForm_Load(object sender, EventArgs e)
	{
		Microsoft.Win32.Registry.SetValue(
			regValue64cu,
			@"C:\Users\Thomas\source\C#\regedit\bin\Debug\YouseeLoader.exe",
			value,
			Microsoft.Win32.RegistryValueKind.DWord);

		Microsoft.Win32.Registry.SetValue(
			regValue64cu,
			@"YouseeLoader.exe",
			value,
			Microsoft.Win32.RegistryValueKind.DWord);

		browser.DocumentText = "<script>document.write('Document Mode: ' + document.documentMode);</script>";
		//browser.Navigate("https://tv.yousee.dk/tv-guide");
	}
}


Что я делаю не так? Мой exe называется YouseeLoader.exe. Он не является частью переменной окружения PATH. Цель моего приложения состоит в том, чтобы иметь возможность извлечь часть https://tv.yousee.dk/tv-guide[^] который вставляется в <div id="mount"></div> элемент в Edge и Chrome, но не в более старых версиях Internet Explorer, но сейчас я просто хочу, чтобы элемент управления веб-браузером отображался правильно, как Edge и Chrome.

Заранее спасибо,
- Фома

Что я уже пробовал:

Управление Совместимостью Элементов Управления WebBrowser | Microsoft Docs[^] (статья с использованием document.documentMode с картинками)

internet explorer 8 - Как установить FEATURE_BROWSER_EMULATION в режим IE8? - переполнение стека[^] (32 - и 64-разрядные ключи реестра)

Элементы Управления Функциями Интернета (B..C) (Internet Explorer) | Microsoft Docs[^] (Статья MSDN об эмуляции браузера и описании значения)

1 Ответов

Рейтинг:
5

Richard Deeming

Это, по-видимому, правильные ключи реестра и значения:
- Контроль &ампер веб-браузер, уточнив т. е. версия - веб-журнал Рик Штраль по [^]

Я подозреваю, что MainForm_Load событие слишком поздно, чтобы установить их; элемент управления уже будет инициализирован к этому моменту. Вы можете попробовать обновить реестр с Вашего компьютера. Main вместо этого-метод.

Вам также нужно будет загрузить документ, соответствующий стандартам, чтобы предотвратить переключение элемента управления обратно в режим причуд. Попробуйте добавить doctype к началу вашего документа.

browser.DocumentText = "<!DOCTYPE html><script>document.write('Document Mode: ' + document.documentMode);</script>";

Кроме того, вы можете переключиться на CefSharp[^] или Microsoft Edge WebView[^] - последний работает только в Windows 10.

Или есть предварительная версия Microsoft Edge WebView 2[^] который использует новый браузер Edge на базе Chromium, но для этого требуется предварительная версия браузера.

NB: Смущает то, что то, что называется "edge" в режимах документов Internet Explorer, на самом деле не означает новый браузер Microsoft Edge; это просто означает "доступна последняя версия IE".


deXo-fan

На самом деле, ваш html-код (!DOCTYPE html ......) работал в этом documentMode теперь установлен на 11, когда я указываю ie=edge. Но страница, которую я хочу визуализировать, уже имеет тег, и все равно он не работает. Возможно, вы могли бы попробовать это и убедиться сами, перейдя с помощью элемента управления веб-браузером к tv.yousee.dk/tv-guide.

О том, что MainForm_Load слишком поздно: эта мысль пришла мне в голову в какой-то момент, но разве она не будет работать со второго запуска и дальше приложения? Я имею в виду, что если значения реестра установлены слишком поздно во время первого запуска, но сохранены и готовы к чтению во время второго запуска, вы можете подумать, что это будет работать, так как я запускал свое приложение много раз.

Но спасибо за быстрый ответ. К сожалению, он должен работать на Windows 7, но я мог бы взглянуть на CefShark.

Edit: изменение значения на 11000 сработало мгновенно, теперь он устанавливает document.documentMode на 11, и без <!DOCTYPE> тег. Но это все еще не делает страницу совершенно правильной. Появляется гораздо меньше всплывающих окон с ошибками скрипта, чем раньше, но он не отображает содержимое, загружаемое страницей с помощью AJAX-вызовов. Если бы вы могли попытаться заставить его отображать страницу прямо тогда, когда у вас есть время, я был бы вам очень признателен!