読者です 読者をやめる 読者になる 読者になる

あらかじめ日記

2chまとめサイト「ソノウソホント?」の雑記と、ブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

まとめサイト「ソノウソホント?」と「ムードもりあげ楽団」はこちら。

【C#】WebBrowserでYouTube動画を再生する(ドキュメントモードと、ユーザーエージェントを変更する方法)

C#WebBrowserコントロールを利用していて、YouTubeのページを見た時に動画が再生できないことに気づきました。
IE本体にはFlashの最新版を入れているはずなのに、「最新版をインストールしてください」と言われる)

その対処方法です。

(この辺の製作記の続きです)

allthewayfrom.hatenablog.com

 これに関しては、どうもWebBrowserはインストールされているInternetExploreで動いてるくせに、最新バージョンではなくIE7として動いていてそのせいでYouTubeの動画が見れなくなっている、とのことのようです。

そのWebBrowserの動作バージョンの変更は、以下のレジストリを加えることで変更できるとのこと。

HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION

ここに、変更したいWebBrowserを持ったexeのファイル名を名前にしてDWORD(32bit)値を作成し、値をIE11なら「11000(10進数)」とする。

また「11001」とすると最新のEdgeモードとなるようで、その詳細はここで確認できます。

Internet Feature Controls (B..C) (Internet Explorer)


上記を見ると、常に標準モード(8888など)とDOCTYPE指定(8000など)によるの違いがあり、結局どうなるんだ!?と気になったので、ローカルファイルのhtmlにdocument.documentModenavigator.userAgentを記述して確認したところ、以下の動きとなりました。
インストールしているIE11です。

FEATURE_BROWSER_EMULATION:なしor7000
documentMode
DOCTYPEが互換モード(記載無し含む)の場合「5」、標準モードの場合はFEATURE_BROWSER_EMULATIONの値
userAgent
何れの場合もIE7
FEATURE_BROWSER_EMULATION:8000~10001
documentMode
7000の場合に同じ
userAgent
8000、9000、10000はIE11
8888、9999、10001はFEATURE_BROWSER_EMULATIONの値
FEATURE_BROWSER_EMULATION:11000、11001
documentMode
モードに限らず「11」
userAgent
モードに限らず「11」


他に、ドキュメントモードを変更をするのに「FEATURE_DOCUMENT_COMPATIBLE_MODE」と言うキーもあるようです。(場所は上記FeatureControlまで同じ)
ただ、このキーはMSDNでは記載が見つかりませんでした。基本的にはFEATURE_BROWSER_EMULATIONを利用する、と言うことなのでしょうか。

同様にexeのファイル名のDWORD(32bit)値で作成します。ただし、値は「110000(10進数)」と桁が一つ違うことに注意。

このキーの指定があると、FEATURE_BROWSER_EMULATIONの値やモードに限らず、documentModeは常にFEATURE_DOCUMENT_COMPATIBLE_MODEの値となり、userAgentには影響しませんでした。
一概にバージョンを切り替える、と言っても色々とパターンがありなんだかややこしい。。

気になるのは、DOCTYPEの指定で変わると書かれている80008888などが、DOCTYPEの違いによる挙動がどちらも同じになっているところですね。。
この辺は詳しい人に是非、補足頂きたいところです。


さて、YouTubeの動画はIE11で動かせば再生できることを確認できました。

とここまで書いておいて、YouTubeはユーザーエージェントさえ変更できれば(中身もそれ相応のブラウザなら)再生できそう、つまりWebBrowserNavigateメソッドの引数でadditionalHeaders(既定のヘッダーに追加するHTTPヘッダー)にユーザーエージェントとしてIE11の時に送られるヘッダ情報を指定すれば良いのでは?と言う事で試したら、別にFEATURE_BROWSER_EMULATIONに追加せずとも、これだけでもいけました。

レジストリを変更したくない場合は、こちらの方でも良さそうです。



ちなみに、WebBrowserのバージョンを変更したらWebBrowserを利用した編集画面で、HtmlElementに関連付けたクリックイベントのハンドリングの動きが変わり誤動作するようになってしまいました。。
どうも今の作りはIE11以前に、互換モードでないとダメなようです。元々その辺りを気にせずに互換モードの動きを前提にしてたのが良くなく出来れば最新に合わせるべきとは思いますが、今更面倒なので悩ましいところです。

もし内部的にhtmlを作成するような処理がある場合は、どのバージョンとするかは作成前に気にしておかないといけないですね。