將 TWebBrowser 設定成 IE 11

C++ Builder 不管是 VCL 或 FireMonkey,都有 TWbeBrowser 元件。在 Windows 系統下,該元件就是一個內嵌的 IE。

其實我很想不要用 IE,希望找到內嵌的 chrome 元件,但目前找到的好像不是很好處理,也擔心日後升級問題,所以在 Windows 下還是暫時先以 IE 為主。

查了說明文件,指出內建的 TWebBrowser 預設的版本是 IE 7。所以我寫了一個很簡單的程式,用 FireMonkey 版的 TWebBrowser,直接連到一個 HMLT5 的網頁

https://www.w3schools.com/html/tryit.asp?filename=tryhtml5_video

這個網頁我在 IE 上測試,要 IE 11 才能順利執行。

底下是我的測試程式執行結果,可以看到就是沒有什麼結果。

image

接著要修改內嵌 IE 的版本,方法就是直接修改 Windows 的登錄檔。

【手動修改】

簡單來說,就是在登錄檔的這個位置

HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER) \SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BEHAVIORS\

在此目錄下加入一組 DWOD,名稱就是你的程式,內容是十進位的 11001。這是要設定成 IE 11 的版本,但前提你的電腦中要有安裝才會有作用。

image

詳細說明可以參考 MSDN,裡面有各種版本的設定值。

https://msdn.microsoft.com/en-us/library/ee330730(v=vs.85).aspx#browser_emulation

在我自己的實驗中,加在 HKEY_LOCAL_MACHINE 是沒有作用的,還花了我不少時間測試,後來改在這層 HKEY_CURRENT_USER 才成功。

底下是修改後的執行畫面,順利成功了。

image

【程式修改】

手動修改是很麻煩的,也不能要求使用者自己做這件事。幸好在文件中有找到一個自動修改的程式,試了也可以順利執行。

程式碼詳見底下網頁的下方。

http://docwiki.embarcadero.com/Libraries/Tokyo/en/FMX.WebBrowser.TWebBrowser

抄一份起來備用,別忘了要 include <System.Win.Registry.hpp>

void __fastcall TForm1::FormCreate(TObject *Sender) {
	SetPermissions();
}
 
void __fastcall TForm1::SetPermissions() {
#ifdef _Windows
	UnicodeString cHomePath = "SOFTWARE";
	UnicodeString cFeatureBrowserEmulation = 
"Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION\\";
	int cIE11 = 11001;
	UnicodeString sKey = ExtractFileName(ParamStr(0));
	TRegIniFile *Reg = new TRegIniFile(cHomePath);
	__try {
		TRegistry *reg1 = dynamic_cast(Reg);
		if (Reg->OpenKey(cFeatureBrowserEmulation,
			true) && !(reg1->KeyExists(sKey) && reg1->ReadInteger(sKey)== cIE11)) {
			reg1->WriteInteger(sKey, cIE11);
		}
	}
	__finally {
		Reg->Free();
	}
#endif
}

事實上,我就是手動修改登錄檔一直失敗,後來才發現這個程式就是在做這件事,執行後果然成功了。再去反查登錄檔,才得知是記錄在 HKEY_CURRENT_USER 這一層。

 
重要度:

發表新回應