由于 DPI 感知,Microsoft 商店认证失败

Microsoft store certification fails due to DPI awareness

我曾想将我的应用程序的新版本(WPF 转换为带有 Desktop Bridge 的 UWP)发布到 Microsoft Store,但它未能通过以下警告的认证:

  • File **.exe neither has PerMonitorV2 manifested in the manifest nor calls into DPI Awareness APIs for ex: user32!SetProcessDpiAwarenessContext or user32!SetThreadDpiAwarenessContext.
  • The app *** is not DPI Aware.

我有以下问题:

  1. 首先,我在去年年底发布了我的应用程序的第一个版本,并且 DPI 意识没有问题。所以这是一个新的测试?

  2. 由于这只是一个警告,所有其他测试都已通过,这可能是认证过程失败的原因?

  3. 所以我试图让我的应用程序了解 DPI...

基于 description I called into SetProcessDpiAwarenessContext function and checked with all of the four 值。使用 unawareSystem aware 标志我的应用程序看起来很模糊,使用 Per Monitor 标志看起来不错,但是当我请求屏幕大小时,它返回原始宽度和高度,不计算比例(我有 150% 的比例),所以我的 windows 被定位到屏幕的错误部分。问题是,如果只有这 4 个标志要设置,并且其中 none 作为默认设置(不设置任何内容),那么默认设置是什么?

好的,here 列出了 5 个标志,但其中 none 个正在工作,就好像没有设置任何东西一样。

非常感谢!

最后我找到了问题的解决方案: 我没有尝试通过从系统 DLL 调用相应的方法来让我的应用程序从代码中识别 DPI,而是不得不 添加一个 app.manifest 文件 WPF项目。当我尝试这种方式时,与无效屏幕尺寸相关的问题消失了。

Here 是一个应该包含此清单文件的示例。一件非常重要的事情是商店没有像上面的例子那样接受 PerMonitor 设置。它必须更改为 PerMonitorV2(顺便说一下,这也是他们在错误消息中询问的内容)。

通过将此设置添加到项目中,它通过了商店的认证。令人惊讶的是,这个警告是认证失败的原因。

添加清单文件后还有一件事,它应该连接到项目。您可以通过将以下代码添加到 <your_project_name>.csproj 文件(例如 here)来实现:

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

为了看到全貌,我还添加了答案的第二步。

尽情享受吧!