我还没有找到 DPI_AWARENESS_CONTEXT 中的确切内容。它作为句柄实现,对于 32 位和 64 位系统来说会有所不同。也许它指向一个结构,或者它可能是一个位掩码。如果是这样,据我所知,该结构尚未定义。
我现在知道您必须使用 AreDpiAwarenessContextsEqual(context1, context2) 来比较两个 DPI_AWARENESS_CONTEXT。您无法比较这些值。这些是我正在使用的相关 Pinvoke 项目:
internal enum PROCESS_DPI_AWARENESS {
PROCESS_DPI_UNAWARE = 0,
PROCESS_SYSTEM_DPI_AWARE = 1,
PROCESS_PER_MONITOR_DPI_AWARE = 2
}
internal enum DPI_AWARENESS {
DPI_AWARENESS_INVALID = -1,
DPI_AWARENESS_UNAWARE = 0,
DPI_AWARENESS_SYSTEM_AWARE = 1,
DPI_AWARENESS_PER_MONITOR_AWARE = 2
}
[DllImport("SHcore.dll")]
internal static extern int GetProcessDpiAwareness(IntPtr hWnd, out PROCESS_DPI_AWARENESS value);
[DllImport("user32.dll")]
internal static extern int GetDpiForWindow(IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern IntPtr GetWindowDpiAwarenessContext(IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern int GetAwarenessFromDpiAwarenessContext(IntPtr dpiContext);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool AreDpiAwarenessContextsEqual(IntPtr dpiContextA,
IntPtr dpiContextB);
您可以使用 WinDef.h 中的这些值来设置或比较:
#define DPI_AWARENESS_CONTEXT_UNAWARE ((DPI_AWARENESS_CONTEXT)-1)
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE ((DPI_AWARENESS_CONTEXT)-2)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE ((DPI_AWARENESS_CONTEXT)-3)
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)
但是,如果您在使用这些值之一执行 Set 后执行 Get,则不要期望返回这些值之一。使用 AreDpiAwarenessContextsEqual。