时间:2019-03-07 标签:c#PinvokeforGetWindowDpiAwarenessContext

2024-01-08

我试图在 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时间:2019-03-07 标签:c#PinvokeforGetWindowDpiAwarenessContext 的相关文章

随机推荐

  • 模拟网络连接不良

    我正在开发一个可以通过 LAN 访问互联网的嵌入式设备 我现在正处于测试阶段 我想测试当互联网连接较差时设备的性能 目前 该设备通过集线器连接到路由器 我用集线器通过 Wireshark 监控数据包 降低设备的互联网速度以模拟可能发生的场景
  • R计算数据帧中相似行的出现次数

    我有以下格式的数据 称为 DF 这只是一个简化的示例 eval num eval count fitness fitness mean green h 0 green v 0 offset 0 random 1 1 1500 1500 10
  • Winform 更新长时间运行的任务

    当应用程序执行长时间运行的任务时 您是否有一个好的解决方案来保持 请稍候 winform 绘制 我尝试在每个步骤中使用 form refresh 但是会发生一些长时间运行的查询 这意味着这不够频繁 基本上是这个那么问题 https stac
  • 简单英语中的乔姆斯基层次结构

    我试图找到乔姆斯基提出的 4 个级别的正式语法 无限制 上下文相关 上下文无关 常规 的简单 即非形式 解释 我已经很久没有学习正式语法了 各种定义现在让我难以想象 明确地说 我是not寻找随处可见的正式定义 例如here http en
  • 如何在管理面板中使用动态数据?

    class Message models Model date models DateField user models ForeignKey UserEx groups models ManyToManyField Group main
  • 如何通过仅编写一次来在客户端和服务器之间共享域类和业务规则,就像在 RIA 服务中一样

    在 ASP NET WCF 应用程序中 我希望在客户端和服务器之间共享域类和业务规则 而不需要重写它们 就像在 Silverlight RIA 服务中一样 将这些收集在一个程序集中并从客户端和服务器引用它可以解决问题 但是如何解决 通过向客
  • 反应性可观察订阅处置

    如果我有权访问一个我知道只会返回一项的 IObservable 这是否有效 它是最佳使用模式吗 IDisposable disposable null disposable myObservable Subscribe x gt DoThi
  • 禁用 Heroku 路由器日志

    我写了一个 Heroku 应用程序 这是一个非常简单的 API 一些GET向其发出的请求包含其参数中的敏感信息 最好不要让 Heroku 记录这些敏感信息 有什么办法可以拥有 Herokunot记录请求或者更好的是 截断路径以使其不包含参数
  • c++ 存储函数和参数列表以供以后使用

    所以我想通过用 C 编写一个小型线程池来挑战自己 并且我想尝试模仿 std thread 的易用方式 您可以创建一个线程并作为参数发送一个函数和参数与 pthreads 之类的函数相比 pthreads 强制您将 void 作为该函数的唯一
  • 刺激控制器在 Rails 7 应用程序中根本无法运行

    我真的很难让 Stimulus 控制器在我正在开发的 Rails 7 应用程序中运行 并且非常感谢任何人可能提供的帮助 我一直在旋转我的轮子 我的应用程序 js Configure your import map in config imp
  • (注意)child pid XXXX 退出信号分段错误(11),/etc/apache2 中可能存在 coredump

    我的 Apache 日志中不断收到以下错误 Wed Sep 18 17 59 20 2013 notice Apache 2 2 22 Ubuntu PHP 5 3 10 1ubuntu3 8 with Suhosin Patch conf
  • 如何为内存中的 HSQL 编写自定义函数

    我想在 HSQL 中编写一个简单的函数 以便它向后兼容 DB2 函数 理论上 我应该能够用 java 编写自定义函数并将其挂接到 HSQL 中 有这方面的任何指导 文件吗 用户定义的函数记录在 HSQLDB 指南中 有关用 Java 编写的
  • java中防止线程重复处理

    问题陈述 我有一个JMS侦听器作为侦听主题的线程运行 一旦有消息进来 我就会生成一个新的Thread处理入界消息 因此 对于每条传入的消息 我都会生成一个新的Thread 我有一个场景 当按顺序立即注入重复消息时 也会处理重复消息 我需要阻
  • 跨多个应用程序的 Google Smart Lock

    我一直在尝试让谷歌的智能锁在我拥有的两个应用程序之间工作 不幸的是使用不同的密钥库 但没有任何运气 在 Smart Lock 中保存一个应用程序的密码非常简单 APP 1 做类似的事情 Credential credential new C
  • 使 svg 容器在数组循环中出现在另一个容器下面

    我有以下代码 我创建了两个不同高度和宽度的 svg 容器 并为数组中的每个元素创建它 该代码运行良好 但我想要 svg 容器 text1 其中包含title1出现在 svg 容器 text2 下方 显示title2而不是像现在这样并排 即彼
  • 如何为 Java EE 开发人员升级 Eclipse?

    有没有什么不痛苦的方法来升级 Eclipse 安装 我尝试浏览 eclipse 站点 但找不到有用的描述 将更新 URL 添加到您的可用站点 窗口 gt 首选项 gt 安装 更新 gt 可用软件站点 gt 添加 Name Oxygen Lo
  • Blazor WASM - 全局捕获 401 并导航到所有 HttpClient 调用的登录页面

    In blazor template httpclient添加在Program cs class builder Services AddTransient sp gt new HttpClient BaseAddress new Uri
  • 是否可以在 Android/dalvik 中重写 Java 类中的本机方法?

    我正在对一个类进行单元测试TestMe使用 EasyMock 及其方法之一 例如method N n 需要一个类型的参数N它有一个本机方法 比如nativeMethod class TestMe void method N n Do stu
  • 移动/触摸屏幕 - 滑动时水平滚动

    这个问题是在详细讨论后提出的这个问题 https stackoverflow com q 11649405 226906 Problem 我需要一个水平滚动 可以使用桌面上的鼠标拖动和启用触摸的屏幕上的滑动事件来滚动 可能的解决方案 我尝试
  • 时间:2019-03-07 标签:c#PinvokeforGetWindowDpiAwarenessContext

    我试图在 C 应用程序中实现 GetWindowDpiAwarenessContext 但没有成功 相关头文件是 windef h DECLARE HANDLE DPI AWARENESS CONTEXT typedef enum DPI