はじめに
拡大縮小の設定をしていると正しい解像度が取れなかったのでメモ。
4kモニタとかだと100%でないことの方が多いのでハマりがち。
基本
Forms.Screen.PrimaryScreen.Bounds から取得できる。
マルチディスプレイなら Forms.Screen.AllScreens に各ディスプレイの値が入っている。
ただ、拡大縮小設定を、たとえば200%にしていると、半分の値になってしまう。
どうするか
2つ方法がある。(意味的には同じことをやっている)
- SetProcessDPIAwareを呼び出す
- マニフェストファイルに
<dpiAware>true</dpiAware>
を追加する
具体的に
SetProcessDPIAwareはNative methodなので、宣言を追加する必要あり。
以下のようにする。
import System.Runtime.InteropServices;
.
.
.
public Form1()
{
NativeMethods.SetProcessDPIAware(); // 最初に呼び出す
InitializeComponent();
}
.
.
.
static class NativeMethods
{
[DllImport("user32.dll")]
public static extern bool SetProcessDPIAware();
}
NativeMethods に入れるのは、
https://docs.microsoft.com/ja-jp/dotnet/fundamentals/code-analysis/quality-rules/ca1060
とかを参照。
マニフェストファイルの方は、ソリューションエクスプローラから新しい項目の追加⇨アプリケーション マニフェスト ファイルでapp.manifestを追加し、コメントになっている
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
のところを生かす。