如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

2024-05-17

我是 WPF(和 DPI 感知 API)的新手,正在编写一个在 Windows 7、8.1 和 10 中运行的应用程序。我使用具有不同每个显示器 DPI 设置的多个显示器,并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容。

我已经知道可以将清单添加到 WPF 应用程序,取消注释 DPI 感知部分,并将其设置为True/PM。这成功地使程序在 Windows 8.1 和 10 中能够感知每个显示器的 DPI(因此在各种显示器上看起来干净清晰),但在 Windows 7 中作为系统感知运行。

但我们能做得更好吗? 微软提供了一个这里的教程展示了如何创建 Per-Monitor DPI-Aware https://msdn.microsoft.com/en-us/library/windows/desktop/ee308410(v=vs.85).aspxWPF 应用程序。 他们所做的实际上是在 C++ 中创建一个新对象来替换<Window>它使用 Windows 8.1 API 不仅可以检测显示器之间的 DPI 变化,还可以re-size运行时的应用程序,有效地匹配 DPI 的变化。 最终结果是,该应用程序不仅具有 Per-DPI 感知能力且外观清晰,而且当在各种尺寸的大小显示器之间切换时,该应用程序会要求用户更改屏幕上相同的物理尺寸(以英寸或厘米为单位) 。

Microsoft Win32 代码的缺点是它不向后兼容 Windows 7。尝试在 7 中运行会导致应用程序崩溃。

我已经经历过这篇关于多布斯博士的文章 http://www.drdobbs.com/windows/coding-for-high-dpi-displays-in-windows/240168736 and 这是肯尼·卡尔的作品 https://msdn.microsoft.com/en-us/magazine/dn574798.aspx但对 API 的理解不够深入,无法让事情正常进行。

有谁知道有一种方法可以执行类似于 Microsoft 代码的操作,在 Windows 8.1 及更高版本中,每个监视器感知的应用程序实际上将改变尺寸在显示器之间移动时,但在 Windows 7 中作为系统感知运行?


我没有看过代码,但我的猜测是由于win 7中缺少本机方法而导致崩溃。 解决这个问题的方法是修改本机方法包装器,例如(伪代码):

public int GetDPIOfMonitor(IntPtr monitorHandle)
{
   if (Enviroment.OSVersion >= "6.2") // win 8 and above
   {
      return NativeMethods.PInvoke.GetMonitorDPI(monitorHandle);
   }
   else return systemDPI;
}

这样你就不会在 7 以下崩溃,因为你没有调用缺少的本机方法。

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

如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序? 的相关文章

  • 单元测试验证失败

    我正在运行我的单元测试PostMyModel路线 然而 在PostMyModel 我用的是线Validate
  • 如何在另一个应用程序中挂钩 api 调用

    我正在尝试挂钩另一个应用程序的 ExtTextOut 和 DrawTextExt GDI 方法调用 我知道我需要使用 GetProcAddress 来查找 gdi32 dll 中那些方法的地址 并用我的函数的地址覆盖我想要挂钩的进程中的地址
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • WindowsFormsHost ZOrder

    看起来 WindowsFormsHost 控件被设置为显示在顶部 有没有办法更改其 z 顺序 以允许同一窗口上的其他 WPF 控件在 WindowsFormsHost 控件之上可见 不幸的是 不能 由于 winformshost 合成到 W
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 如何使用placement new重新初始化该字段?

    我的课程包含字段 private OrderUpdate curOrderUpdate 我一遍又一遍地使用它 经常需要重新初始化 for int i 0 i lt entries size i auto entry entries i ne

随机推荐