gpt4 book ai didi

用于 GetWindowDpiAwarenessContext 的 c# Pinvoke

转载 作者:行者123 更新时间:2023-11-30 14:46:25 27 4
gpt4 key购买 nike

我试图在 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 中的确切内容。它作为一个句柄实现,对于 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。

关于用于 GetWindowDpiAwarenessContext 的 c# Pinvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49033938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com