SetProcessDpiAwareness 没有效果

2023-12-19

我一直在尝试禁用 ClickOnce 应用程序上的 DPI 感知。
我很快发现,不可能在清单中指定它,因为 ClickOnce 不支持清单文件中的 asm.v3。

我发现的下一个选项是调用新的 Windows 函数设置进程Dpi感知 https://msdn.microsoft.com/en-us/library/windows/desktop/dn302122(v=vs.85).aspx.

根据this https://msdn.microsoft.com/en-us/library/windows/desktop/dd464659(v=vs.85).aspx教程,

在创建应用程序窗口之前调用 SetProcessDpiAwareness。

And this https://msdn.microsoft.com/en-us/library/windows/desktop/dn469266(v=vs.85).aspx教程,

您必须在任何 Win32API 调用之前调用 SetProcessDpiAwareness

您必须尽早调用该函数。因此,为了进行测试,我创建了一个完全空白的 WPF 应用程序,并将其作为我的整个 App 类:

[DllImport("SHCore.dll", SetLastError = true)]
private static extern bool SetProcessDpiAwareness(PROCESS_DPI_AWARENESS awareness);

[DllImport("SHCore.dll", SetLastError = true)]
private static extern void GetProcessDpiAwareness(IntPtr hprocess, out PROCESS_DPI_AWARENESS awareness);

private enum PROCESS_DPI_AWARENESS
{
    Process_DPI_Unaware = 0,
    Process_System_DPI_Aware = 1,
    Process_Per_Monitor_DPI_Aware = 2
}

static App()
{
    var result = SetProcessDpiAwareness(PROCESS_DPI_AWARENESS.Process_DPI_Unaware);
    var setDpiError = Marshal.GetLastWin32Error();
    MessageBox.Show("Dpi set: " + result.ToString());

    PROCESS_DPI_AWARENESS awareness;
    GetProcessDpiAwareness(Process.GetCurrentProcess().Handle, out awareness);
    var getDpiError = Marshal.GetLastWin32Error();
    MessageBox.Show(awareness.ToString());

    MessageBox.Show("Set DPI error: " + new Win32Exception(setDpiError).ToString());
    MessageBox.Show("Get DPI error: " + new Win32Exception(getDpiError).ToString());
}

3个消息框显示以下内容:

Dpi 设置:真
Process_System_DPI_Aware
设置 DPI 错误:System.ComponentModel.Win32Exception (0x80004005):访问被拒绝
System.ComponentModel.Win32Exception(0x80004005):操作成功完成

为什么应用程序仍设置为 DPI_Aware?这个电话还不够早吗?
该应用程序确实经历了 DPI 缩放。

当我使用清单定义时:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowsSettings>
    <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">false</dpiAware>
  </windowsSettings>
</application>

它确实返回 Process_DPI_Unaware。

EDIT 1:
现在直接在 pInvoke 方法之后获取 Marshal.GetLastWin32Error() ,这实际上会返回一个错误。


当心SetLastError and GetLastWin32Error,之间的任何调用,例如MessageBox.Show会影响其结果。确保在调用本机方法后始终获得最后一个错误。

因此,很可能您得到了预期的行为,但被错误代码误导了。

请参阅此博客文章以获得完整的解释:http://blogs.msdn.com/b/oldnewthing/archive/2015/08/19/10636096.aspx http://blogs.msdn.com/b/oldnewthing/archive/2015/08/19/10636096.aspx

EDIT

不太确定导致访问被拒绝的原因...但是有一个简单而有效的技巧可以禁用 DPI 感知:

编辑你的AssemblyInfo.cs并添加以下内容:

[assembly: DisableDpiAwareness]

Source: https://code.msdn.microsoft.com/windowsdesktop/Per-Monitor-Aware-WPF-e43cde33 https://code.msdn.microsoft.com/windowsdesktop/Per-Monitor-Aware-WPF-e43cde33(PerMonitorAwareWPFWindow.xaml.cs 中的注释)

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

SetProcessDpiAwareness 没有效果 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • WPF 绑定 CompositeCollection 中的 MenuItem 不起作用

    我在将命令绑定到复合集合中的菜单项时遇到问题 这MenuItem是其一部分ContextMenu这是定义在UserControl Resources 问题是新标签的绑定不起作用 当我将 MenuItem 放置在复合集合之外时 它将起作用 有
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 我如何检查我的应用程序是否正在运行

    如何检查我的 Android 应用程序是否已在运行以防止重复启动 如何进行 硬退出 以防止我的应用程序在后台运行 双发射 是不可能的 如果您的应用程序已经在运行 并且您尝试启动另一个实例 那么您将恢复第一个启动实例 您可以通过添加来完成活动
  • 使用注释扩展 Hibernate 实体

    我需要扩展一个具有相同特征的实体 而不使用抽象类 我可以编写如下代码吗 Entity Table name ABC SequenceGenerator sequenceName SEQ ABC name idGenerator alloca
  • 如何在 C++ 中将光标位置设置为行首?

    所以我试图制作代码的一部分 在其中写入一些内容 然后覆盖它 像这样 10 seconds have passed 11 seconds have passed 12 seconds have passed 而不使用新行来打印它 所以我不想使
  • Java EJB JNDI Bean 查找失败

    我有以下结构
  • 如何在 Apple Silicon M1 上原生安装 NodeJS?

    我正在尝试在新的 Apple Silicon MacBook Pro 上安装 NodeJS 但我无法找到在基于 ARM 的 Apple M1 上安装它的方法 标准安装将在 Intel 模拟模式下运行 但我看到他们已经有 ARM Linux
  • Hudson 无限循环轮询 Git 存储库中的更改?

    Hudson 的 git 插件运行良好 但是 构建脚本必须更新存储库中文件的版本号 提交并推送回存储库 当 Hudson 轮询下一步以检查更改时 它会进入无限循环 因为它看到提交作为 更改 再次构建 从而提交更改 因此它再次构建 然后提交另
  • 库未加载:/opt/local/lib/libffi.5.dylib 但我正在使用自制软件

    我正在尝试在 Mac OS X Lion XCode 4 3 OSX GCC Installer Homebrew 上运行守卫 错误信息 Library not loaded opt local lib libffi 5 dylib 我没有
  • 如何使用实体框架检索插入实体的 ID?

    我在 ASP NET 中的实体框架方面遇到问题 每当我向数据库添加对象时 我都想获取 Id 值 我怎样才能做到这一点 根据实体框架 https entityframework net 解决办法是 using var context new
  • 使用 plyr、doMC 和 summarise() 处理非常大的数据集?

    我有一个相当大的数据集 约 140 万行 我正在对其进行一些拆分和总结 整个事情需要一段时间才能运行 而我的最终应用程序依赖于频 繁运行 所以我的想法是使用doMC和 parallel TRUE像这样使用 plyr 进行标记 稍微简化一下
  • 在序言中的特定元素之前和之后拆分列表(不使用“split”谓词?)

    我试图将列表拆分为特定元素 特别是 停止 一词 之前的项目以及该元素之后的项目 我知道你可以使用 split 来做到这一点 但我是序言新手 所以我正在尝试在当前不使用这些函数的情况下操作事物 所以我真的很想知道这是否可能 也许还有一些正确方
  • 设计键盘快捷键的最佳实践

    I am a big fan of keyboard shortcuts If some function or operation doesn t have shortcut I tend to write a little progra
  • 如何动态创建类

    我需要动态创建一个类对象 我尝试使用动态关键字 dynamic dataTransferObject new dtoClass dataTransferObject Property1 someValue dataTransferObjec
  • Python - IndexError:列表索引超出范围 - 不起作用

    这是我的 scrap py 代码 from bs4 import BeautifulSoup as soup from urllib request import urlopen as uReq website https houston
  • 圆圈的边框样式为刻度线

    我有一个带有虚线边框的圆圈 然而 边框应该更像垂直的破折号 而不是点 有没有办法用css使边框与设计完全相同 垂直虚线而不是粗实线 我想更改此类 OtherCaptionBorder My css caption circle positi
  • 使用 JsonConverter 的 Json.NET 自定义序列化 - 如何获得“默认”行为

    我的类 DataType 有一个 JsonConverter 当 Json 中使用纯字符串作为 DataType 类型的属性值时 我想进行一些特殊处理 在该值是 完整 对象的情况下 我想进行 正常 反序列化 这是我的尝试 public ov
  • print() 函数打印列表中每个元素的内容

    基本上 我正在尝试编写一个打印语句 该语句允许我在运行 driver java 时将每行的元素作为 println 打印为输出 我一生都不知道该怎么做 任何帮助将不胜感激 这是driver java public class Driver
  • 如何将 ANSEL 文本转换为 UTF-8

    如何在 C 中将 ANSEL 编码的文本更改为 UTF 8 这是一个重要的转换 因为 Windows NET Framework 没有 ANSEL 代码页 看here http www heiner eichmann de gedcom c
  • 实体框架登录失败错误

    我已经在 IIS 中托管了我的 WCF 应用程序 并设置了一个集成了 4 0 的应用程序池 我将池标识配置为网络服务 我已经检查了与此问题相关的其他帖子 但无法解决它 我得到以下异常 System Data Entity Core Enti
  • 混合地图类型图块的 Google 地图图块 URL?

    我找到了常规地图图块的基本 URL 结构 https mts1 google com vt lyrs m 186112443 hl x local src app x 1325 y 3143 z 13 s Galile 从 Google 获
  • SetProcessDpiAwareness 没有效果

    我一直在尝试禁用 ClickOnce 应用程序上的 DPI 感知 我很快发现 不可能在清单中指定它 因为 ClickOnce 不支持清单文件中的 asm v3 我发现的下一个选项是调用新的 Windows 函数设置进程Dpi感知 https