こんにちは、Office 開発サポート チームの中村です。
今回の記事では、ユーザーフォーム上に WebBrowser コントロールを貼り付けて利用している場合に、Windows 10 バージョン 1703 以降の OS で Office 2016 をバージョン 1801 以降に更新すると、WebBrowser コントロールがユーザーフォームの外に表示される動作について記載します。
再現手順
1. 新規 Excel ブックを作成し、Visual Basic Editor でユーザーフォーム (UserForm1) を追加して、WebBrowser コントロールとボタン コントロールを貼り付けます。

図 1. ユーザーフォームへの WebBrowser コントロール追加
2. ボタン コントロールのクリック イベント ハンドラに以下のようなコードを記述します。
Private Sub CommandButton1_Click()
UserForm1.WebBrowser1.Navigate2 ("http://www.microsoft.com")
End Sub
3. F5 キーを押下して、ユーザーフォームを表示すると、以下のように WebBrowser コントロールがユーザーフォームのウィンドウ外に表示されます。

図 2. WebBrowser がユーザーフォーム外に表示されている状態
現象詳細
この動作は、バージョン 1801 で追加されたオプション項目「ディスプレイで最適な解像度を使用」が有効な場合に発生します (更新後、既定では有効に設定されています)。
![図 3. [ディスプレイで最適な解像度を使用] オプション](http://msdnshared.blob.core.windows.net/media/2018/01/03_WebBrowser_Option.png)
図 3. [ディスプレイで最適な解像度を使用] オプション
一方で、WebBrowser コントロールのように、コントロールによっては、表示の際にコントロール自身のウィンドウとユーザーフォーム ウィンドウとの親子関係の設定が行われます。このときに、ユーザーフォームとコントロールのウィンドウで、それぞれ解像度の認識状況が異なると、以下の SetParent 関数のリファレンス ページに記載の通り、Windows 10 バージョン 1703 以降の OS ではエラーが返され、親子関係を設定することができません。
タイトル : SetParent function
アドレス : https://msdn.microsoft.com/en-us/library/windows/desktop/ms633541(v=vs.85).aspx
<公開情報より抜粋>
Unexpected behavior or errors may occur if hWndNewParent and hWndChild are running in different DPI awareness modes. The table below outlines this behavior:
Operation | Windows 8.1 | Windows 10 (1607 and earlier) | Windows 10 (1703 and later) |
SetParent (In-Proc) | N/A | Forced reset (of current process) | Fail (ERROR_INVALID_STATE) |
SetParent (Cross-Proc) | Forced reset (of child window's process) | Forced reset (of child window's process) | Forced reset (of child window's process) |
これらの動作の結果、WebBrowser コントロールとユーザーフォームの親子関係が設定されず、WebBrowser コントロールがユーザーフォームとは別に表示されます。
WebBrowser コントロールに限らず、同じようにウィンドウを持つコントロールでは、同様に現象が発生する場合があります。(MSCOMCTL.OCX に含まれる TreeView コントロールなどのように、ウィンドウを持つコントロールでも現象が発生しないコントロールもあります。)
補足
- 「ディスプレイで最適な解像度を使用」オプションは、Excel / Word / PowerPoint / Visio に追加されていますが、Word では本手順で現象は発生しません。
- OS が Windows 10 バージョン 1703 より古い場合は、「ディスプレイで最適な解像度を使用」オプションは表示されません。
- VBE のメニューの実行ボタン (緑色の右三角のボタン) や、[実行] – [Sub/ユーザーフォームの実行] から実行すると、現象は発生しません。F5 キーや、プロシージャから UserForm.Show を実行してユーザーフォームを表示する場合に発生します。
回避策
1. 「ディスプレイで最適な解像度を使用」オプションを無効にする
先述の通り、この現象はこのオプションが有効な場合にのみ発生します。この機能が不要な場合、これをオフにして回避することができます。
ユーザー全体に展開したい場合やプログラムから変更したい場合には、以下のレジストリで制御できます。ただし、設定値の反映には Office アプリケーションの再起動が必要です。アプリケーションの処理中に一時的に変更するような場合には、Office アプリケーションを起動する前にこのレジストリを変更する必要があります。
キー :
<Excel / Word / PowerPoint 向け>
HKEY_CURRENT_USERSoftwareMicrosoftOffice16.0<アプリケーション名>Options
(<アプリケーション名> には、Excel / Word / PowerPointが入ります。ただ、Word は先述の通りこの手順で現象は発生しませんので回避策としての設定は必要ありません。)
<Visio 向け>
HKEY_CURRENT_USERSoftwareMicrosoftOffice16.0VisioApplication
名前 :
RenderForMonitorDpi
種類 :
REG_DWORD
値 :
0 (0 =無効 / 1 =有効)
2. カスタム作業ウィンドウで WebBrowser コントロール表示する
カスタム作業ウィンドウ内に WebBrowser コントロールを貼り付ける場合には、現象は発生しません。VSTO ソリューションなどでカスタム作業ウィンドウを追加し、この中で WebBrowser コントロールを使用するよう仕組みを変更することが検討できます。カスタム作業ウィンドウの作成手順は以下の公開情報を参照してください。
タイトル : カスタム作業ウィンドウ
アドレス : https://msdn.microsoft.com/ja-jp/library/aa942864.aspx
今回の投稿は以上です。
本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。