我正在尝试在C#应用程序中实现GetWindowDpiAwarenessContext,但一直没有成功。
相关的头文件为:
windef.h
DECLARE_HANDLE(DPI_AWARENESS_CONTEXT);
typedef enum DPI_AWARENESS {
DPI_AWARENESS_INVALID = -1,
DPI_AWARENESS_UNAWARE = 0,
DPI_AWARENESS_SYSTEM_AWARE = 1,
DPI_AWARENESS_PER_MONITOR_AWARE = 2
} DPI_AWARENESS;
#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)
WinUser.h
WINUSERAPI
DPI_AWARENESS_CONTEXT
WINAPI
GetWindowDpiAwarenessContext(
_In_ HWND hwnd);
我正在使用:
/// <summary>
/// Class for native methods.
/// </summary>
internal static class NativeMethods {
[DllImport("user32.dll")]
internal static extern IntPtr GetWindowDpiAwarenessContext(IntPtr hWnd);
...
// Dpi awareness context
IntPtr dpiAwarenessContext = NativeMethods.GetWindowDpiAwarenessContext(process.Handle);
if (dpiAwarenessContext == (IntPtr)(-1)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_UNAWARE");
} else if (dpiAwarenessContext == (IntPtr)(-2)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_SYSTEM_AWARE");
} else if (dpiAwarenessContext == (IntPtr)(-3)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE");
} else if (dpiAwarenessContext == (IntPtr)(-4)) {
sb.AppendLine(" DPI Awareness Context: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2");
} else {
sb.AppendLine(" DPI Awareness Context failed: " + dpiAwarenessContext);
}
它返回以下之一:0、18、34、24592、61457,而不是预期的-1、-2、-3或-4。此外,在对同一窗口进行后续调用时,返回值会有所变化。(这些窗口位于其他进程而不是该应用程序中。)
问题在于如何正确定义和调用GetWindowDpiAwarenessContext。
提前感谢您的帮助。
DPI_AWARENESS_CONTEXT
是一个句柄,指针大小也是如此。 - David HeffernanDPI_AWARENESS
的声明有点令人困惑。它与什么相关呢? - David Heffernan