首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#对GetWindowDpiAwarenessContext的调用

c#对GetWindowDpiAwarenessContext的调用
EN

Stack Overflow用户
提问于 2018-02-28 16:12:46
回答 1查看 2.2K关注 0票数 4

我试图在一个没有成功的GetWindowDpiAwarenessContext应用程序中实现C#。

相关的头文件是:

windef.h

代码语言:javascript
复制
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

代码语言:javascript
复制
WINUSERAPI
DPI_AWARENESS_CONTEXT
WINAPI
GetWindowDpiAwarenessContext(
    _In_ HWND hwnd);

我正在使用:

代码语言:javascript
复制
/// <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。此外,在随后对同一窗口的调用中,返回值会发生变化。( windows在此应用程序之外的其他进程中。)

问题是定义和调用GetWindowDpiAwarenessContext的正确方法是什么。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-03-05 16:58:24

我还没有找到DPI_AWARENESS_CONTEXT中的确切内容。它作为句柄实现,这将是不同的32位和64位系统.它可能指向一个结构,也可能是一个位掩码。如果是这样的话,就没有定义我所能判断的结构。

现在我知道您必须使用AreDpiAwarenessContextsEqual(context1,context2)来比较两个DPI_ now _CONTEXT,您不能比较这些值。以下是我正在使用的相关Pinvoke项:

代码语言:javascript
复制
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中的这些值来设置或比较:

代码语言:javascript
复制
#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)

但是,如果您使用这些值之一在集合之后进行获取,则不要期望得到这些值中的一个。使用AreDpiAwarenessContextsEqual。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49033938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档