IWebBrowser2をDPIの動的変更に追従させる

トップレベルウィンドウを生成する前にSetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED)を呼ぶことで、IWebBrowser2もDPIに追従してくれるようになる。

SetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED );

auto wnd = CreateWindowEx( 0, L"sample app", L"sample app", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL );
if( !wnd )
	return 0;

SetThreadDpiAwarenessContext()は、実行後にその同一スレッド内で生成されるトップレベルウィンドウに効果を与える。トップレベルウィンドウのタイトルバーなどの非クライアント領域とクライアント領域、およびその子ウィンドウのDPI認識に影響する。

DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALEDはWindows10 バージョン1809で追加された値で、テキストやGDIベースのコントロールが自動的に調整されるようになるが、基本的な動作はDPI_AWARENESS_CONTEXT_UNAWAREと同等であり、これを指定するとWM_DPICHANGEDは飛んでこなくなる。

なお、マニフェストなどでプロセスのDPI認識がPer Monitor AwarePer Monitor Aware V2になっている必要がある。