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问题

    作为我正在进行的项目的一部分 我必须开始学习 C 我已经开始解决其中的 欧拉 问题 并且遇到了麻烦 我必须找到 1000 以下的所有 3 或 5 的倍数之和 有人可以帮助我吗 谢谢 include
  • 在 C++ 中,std::string::push_back() 的摊余复杂度是 O(1) 吗?

    我知道标准指定它适用于向量 但是字符串呢 是的 它是摊销常数时间 请参见第 716 页的表 101本文件的 http www open std org jtc1 sc22 wg21 docs papers 2012 n3485 pdf 表
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • MSVC10 /MP 在项目中跨文件夹构建非多核

    我希望有人指出我们所遇到的错误或解决方法 使用 MP 编译项目时 似乎仅同时编译同一文件夹中的文件 我使用进程资源管理器来滑动命令行并确认行为 项目过滤器似乎对同时编译的内容没有影响 项目结构disk Folder project vcxp
  • 如何(可移植地)在 C 和 C++ 中获取 DBL_EPSILON

    我正在 Linux AS 3 上使用 GCC 3 4 并试图找出DBL EPSILON 或者至少是一个不错的近似值 我怎样才能以编程方式获取它 在 C 中是std numeric limits
  • 使用 Process.Start() 打开文件夹时访问被拒绝异常

    我有一个 C 中的 winforms 应用程序 我必须在其中打开某个文件夹 我用 System Diagnostics Process Start pathToFolder 这会导致以下异常 System ComponentModel Wi
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • 为什么Windsor只能拦截虚方法或接口方法?

    我正在阅读文档 发现如果不使用接口 那么 Windsor 只能拦截虚拟方法 这是 Windsor 的限制还是 C 语言的限制 我正在寻找深入的答案 C 语言在这里完全无关 问题是拦截在运行时级别如何工作 一种技术是从类继承 实现接口并将其用
  • 二维数组的列求和

    我有一个IEnumerable
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • Docker 不遵循构建目录中的符号链接

    我正在对一个应用程序进行 Docker 化 其中涉及通过 Clang 将二进制文件与其他 C 文件链接 我们维护二进制文件的符号链接版本 因为它们在整个代码库中使用 我的 Docker 构建目录包含整个代码库 包括源文件以及这些源文件的符号
  • C++ 虚拟关键字与重写函数

    我正在学习c 并且正在学习virtual关键字 我在互联网上搜索试图理解它但无济于事 我进入编辑器并做了以下实验 期望它打印两次基本消息 因为我的印象是需要 virtual 关键字来覆盖函数 然而 它打印出了两条不同的消息 有人可以向我解释
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • 函数中的重复参数检查

    我经常有调用层次结构 因为所有方法都需要相同的参数 如果我不想将它们放在实例级别 类的成员 那么我总是问我在每个方法中检查它们的有效性是否有意义 例如 public void MethodA object o if null o throw
  • Xamarin.Android JmDNS 绑定问题

    我开始研究 Xamarin Android 的 JmDNS 绑定 我设法构建了绑定 但无法从代码中引用它 https github com ytn3rd monodroid bindings tree master JmDNS https
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 不兼容的指针到字符转换

    我正在编写一个程序 将卡片值写入 52 个点字符的多维数组中 该程序是一个测试数组 稍后我将其作为函数写入主程序中 在程序中 我通过以下方式初始化 for 循环计数0通过51 我用一个switch语句调制13将卡牌值分配给数组点 但是 我收
  • 为什么 char 数组需要 strcpy 而 char star 不需要 - 在 C 中使用结构

    我对这段代码有一个误解 typedef struct EXP int x char name char lastName 40 XMP main XMP a a name eaaa a lastName strcpy a lastName

随机推荐

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

    如何检查我的 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