web-dev-qa-db-ja.com

Windows 10で、いくつかのプログラムがセカンドモニターでスケーリングしないのはなぜですか?

以下の2つのスクリーンショットによると、メニューが大きすぎるため、Adobe Acrobat DCおよびInternet Explorerは2台目のモニターで正しく拡大縮小できませんでした。Settings > System > Displayでは、 'スライダーは既に左端にあるため、テキスト、アプリ、およびその他のアイテムですが、他の一部のプログラム(MS Office)は正しくスケーリングします。

ディスプレイアダプター:Intex HD Graphics 530、NVIDIA GeForce GTX 960M、ドライバーバージョン354.74
モニター1(正しいスケーリング):Lenovo Ideapad Y700、3840 x 2160
モニター2(スケーリングが不完全):Dell E153FP、1024 x 768

enter image description here

いくつかのプログラムが異なる画面で正しく動作しないのになぜそうしないのか

最近のWindowsアプリケーションには manifest を含める必要があります。これは、通常、メインEXEファイルに埋め込まれるXMLドキュメントです。マニフェストは、プログラムがUAC昇格を要求するかどうか、より適切にはDPI認識のレベルなど、いくつかの重要なことを宣言します。さまざまな1インチあたりのドット数設定でプログラムを再描画する方法をプログラムが理解していれば、DPI対応です。

この古い新しいものの記事 は、Windows 8.1以降で利用可能なDPI認識の3つのレベルについて言及しています。 -DPI認識を監視します。最後の2つの違いは、モニターごとにDPIが異なる可能性があるため、モニターごとのDPI対応プログラムは、使用しているモニターに応じて再描画する必要があることです。システムDPI対応プログラムは、最高のDPIモニター用に自身をスケーリングし、次にシステムはそれらを適切に縮小します。

文字列<dpiAwareを16進エディタで検索して、あなたが言及したプログラムのマニフェストを調べました。これらは私の結果です:

  • Internet Explorer 11:True/PM(モニターごとに対応)
  • Microsoft Word 2016:True(システム対応)
  • Adobe Reader XI:True/PM

したがって、Wordはシステムによって部分的に処理され、期待どおりに機能する理由が説明されています。他のプログラムは自分自身を処理する必要がありますが、明らかにそれらはめちゃくちゃになっています。モニターごとのDPI対応プログラムは、モニターの変更に関する情報を WM_DPICHANGED ウィンドウメッセージで受け取りますが、これらのプログラムは、それに応じて適切な処理を行っていないようです。

参考資料: DPI対応のデスクトップおよびWin32アプリケーションの記述

それを修正する方法

互換性インフラストラクチャを使用してぼかしを強制する(つまり、プログラムにDPIをまったく認識させない)ことは 可能 ですが、これらのプログラムを部分的にのみDPI対応にする(つまり、システムレベルを使用する)ように思われます)。私が考えられる唯一の方法は、EXEを16進エディターで叩き、マニフェストを変更することです。私は XVI32 が好きです。

管理者として16進エディターを実行し、変更するプログラムファイルを開きます。 <dpiAwareを検索し、True/PM(または同じものの別の大文字)が見つかるまで少し先を読みます。直後に</dpiAware>終了タグが続く可能性があるため、次のように上書きします。

Old: True/PM</dpiAware>
New: True</dpiAware>   

余分なスペース(re>)は必ずスペースで上書きしてください。保存する前に、ファイルのアクセス許可をいじる必要がある場合があります。ファイルが変更されると、それはシステムDPI対応プログラムのみになります。

Windows 10に付属するInternet Explorerのビルドは、マニフェストではなく SetProcessDpiAwareness を使用してDPI認識を設定しているようです。したがって、16進編集でもう少し真剣に取り組む必要があります。 windowsSettingsを検索し、カーソルを前のapplicationタグの閉じ括弧の直後に移動します。このすべてで上書き:

<windowsSettings><dpiAware xmlns="http://schemas.Microsoft.com/SMI/2005/WindowsSettings">true</dpiAware></windowsSettings></application><compatibility xmlns="urn:schemas-Microsoft-com:compatibility.v1"><application><!--

完了すると、次のようになります(新しい部分を赤で強調表示し、変更された部分の先頭に青いカーソルを置きました)。

iexplore.exe changed

これは、デフォルトマニフェストの余分なスペースとコメントを利用して、新しい設定を挿入し、compatibility要素を少し前に移動します。 dpiAwarenessがマニフェストに設定されている場合、SetProcessDpiAwareness関数は効果がありません。

Windowsリソース保護が変更をロールバックする可能性があるため、プログラムが自動的に元に戻される場合は、スクリプトを設定して新しいバージョンを再コピーする必要がある場合があります。

注意!文字を挿入または削除するのではなく、上書きすることが非常に重要です。挿入または削除すると、残りの実行可能データがシフトし、多くのことが壊れます。転記エラーが発生した場合は、BackspaceキーまたはDeleteキーを押さないでください。代わりに、カーソルを戻し、エラーを正しい文字で上書きします。以前に16進エディターを使用したことがない場合は、EXEファイルを変更する前にバックアップを作成する必要があります。

5
Ben N