Microsoft商店认证失败,原因是DPI感知问题。

5
我本想发布我新应用的更新版本(WPF转为UWP并使用桌面桥接),但它未通过认证并显示以下警告:
  • 文件 **.exe 的清单中既没有PerMonitorV2,也没有调用DPI Awareness的API,例如:user32!SetProcessDpiAwarenessContext或user32!SetThreadDpiAwarenessContext。
  • 应用程序***不具备DPI感知功能。
我有以下问题:
  1. 首先,我在去年底发布了我的应用程序的第一个版本,并且没有DPI感知方面的任何问题。那么这是一项新测试吗?
  2. 由于这只是一个警告,并且所有其他测试都已通过,这可能是认证过程失败的原因吗?
  3. 因此,我尝试使我的应用程序具有DPI感知功能...
根据这个描述,我调用了 SetProcessDpiAwarenessContext 函数,并检查了所有四个值。使用 unawareSystem aware 标志使我的应用程序变得模糊,而使用 Per Monitor 标志看起来很好,但是当我请求屏幕大小时,它返回原始的宽度和高度,不包括比例(我有一个150%的比例),因此我的窗口位置错误。问题是,如果只有这4个标志可以设置,并且没有任何一个作为默认设置(不设置任何内容),那么默认设置是什么?
好吧,在这里列出了5个标志,但没有任何一个运作好像没有设置任何东西一样。
非常感谢!

一个 WPF 应用程序调用了 SetProcessDPIAware(),但这并不足以使商店满意。为了让自己具备监视器感知能力,你必须要做更多的工作,在窗口移动到另一个监视器时必须要处理所接收到的通知。它建议使用 SetProcessDpiAwareness() 而不是使用清单,如果应用程序在另一个监视器上启动,则有困难是预期的。你必须处理 WM_DPICHANGED. - Hans Passant
警告不应该阻止摄取;您是否尝试联系商店支持? - Peter Torr - MSFT
1个回答

3

最终我找到了解决问题的方法:不要试图通过调用系统DLL中对应的方法来使我的应用程序DPI感知,而是需要在WPF项目中添加一个app.manifest文件。尝试这种方式后,与无效屏幕大小相关的问题消失了。

这里有一个包含应该包含在manifest文件中的示例内容。非常重要的一点是,商店不接受上面示例中的PerMonitor设置。它必须更改为PerMonitorV2(顺便说一下,这也是错误消息中提到的内容)。

通过将这些设置添加到项目中,项目通过了商店的认证。令人惊讶的是,正是这个警告导致了认证失败。

在添加manifest文件后,还需要将其连接到项目中。您可以通过在<your_project_name>.csproj文件中添加以下代码(例如这里)来实现这一点:

<PropertyGroup>
  <ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>

为了看到整个流程,我还加入了这个答案中的第二步骤。
祝您使用愉快!

2
如果你在使用UWP而不是WPF时遇到问题,做同样的事情。这将修复此警告。 - steam3d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接