@@ -72,4 +72,61 @@ public enum MessageBoxResult : int
7272 IDTRYAGAIN = 10 ,
7373 IDCONTINUE = 11
7474 }
75+
76+ public enum DPI_AWARENESS_CONTEXT
77+ {
78+ DPI_AWARENESS_CONTEXT_UNAWARE = - 1 ,
79+ DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = - 2 ,
80+ DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = - 3 ,
81+ DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = - 4 ,
82+ DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED = - 5 ,
83+ }
84+
85+ /// <summary>
86+ /// Requires Windows 10 version 1703 (build 15063) or later for
87+ /// <see cref="DPI_AWARENESS_CONTEXT.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2"/>.
88+ /// Call this before any windows are created.
89+ /// </summary>
90+ [ DllImport ( "user32.dll" ) ]
91+ public static extern bool SetProcessDpiAwarenessContext ( nint dpiContext ) ;
92+
93+ [ DllImport ( "user32.dll" ) ]
94+ public static extern nint GetThreadDpiAwarenessContext ( ) ;
95+
96+ [ DllImport ( "user32.dll" ) ]
97+ public static extern bool AreDpiAwarenessContextsEqual ( nint dpiContextA , nint dpiContextB ) ;
98+
99+ /// <summary>
100+ /// Gets the current thread DPI awareness context.
101+ /// Requires Windows 10 version 1607 (build 14393) or later.
102+ /// <see cref="DPI_AWARENESS_CONTEXT.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2"/> is only reported on Windows 10 version 1703 or later.
103+ /// </summary>
104+ public static bool GetProcessDpiAwarenessContext ( out DPI_AWARENESS_CONTEXT dpiContext )
105+ {
106+ dpiContext = default ;
107+
108+ nint context = GetThreadDpiAwarenessContext ( ) ;
109+ if ( context == 0 )
110+ return false ;
111+
112+ DPI_AWARENESS_CONTEXT [ ] known =
113+ [
114+ DPI_AWARENESS_CONTEXT . DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ,
115+ DPI_AWARENESS_CONTEXT . DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ,
116+ DPI_AWARENESS_CONTEXT . DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ,
117+ DPI_AWARENESS_CONTEXT . DPI_AWARENESS_CONTEXT_UNAWARE ,
118+ DPI_AWARENESS_CONTEXT . DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED ,
119+ ] ;
120+
121+ foreach ( DPI_AWARENESS_CONTEXT candidate in known )
122+ {
123+ if ( AreDpiAwarenessContextsEqual ( context , ( nint ) candidate ) )
124+ {
125+ dpiContext = candidate ;
126+ return true ;
127+ }
128+ }
129+
130+ return false ;
131+ }
75132}
0 commit comments