由于 DPI 意识,Microsoft Store 认证失败

Att*_*ász 5 c# wpf publishing uwp desktop-bridge

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

  • 文件 **.exe 既没有在清单中显示 PerMonitorV2,也没有调用 DPI 感知 API(例如:user32!SetProcessDpiAwarenessContext 或 user32!SetThreadDpiAwarenessContext)。
  • 该应用程序 *** 不支持 DPI。

我有以下问题:

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

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

  3. 所以我试图让我的应用程序 DPI 感知......

根据这个描述,我调用了SetProcessDpiAwarenessContext函数并检查了所有四个值。使用unawareSystem aware标志时,我的应用程序看起来很模糊,使用Per Monitor标志时看起来不错,但是当我请求屏幕尺寸时,它返回原始宽度和高度,不计算比例(我有 150% 的比例),因此我的窗口被定位到屏幕的错误部分。问题是,如果只需要设置这 4 个标志,并且没有一个标志作为默认值(不设置任何内容),那么默认设置是什么?

好的,这里列出了 5 个标志,但它们都不起作用,就好像没有设置任何东西一样。

多谢!

Att*_*ász 3

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

以下是应包含此清单文件的示例。非常重要的一点是,商店没有接受PerMonitor上面示例中的设置。必须将其更改为PerMonitorV2(顺便说一下,这也是他们在错误消息中所要求的)。

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

添加清单文件后,还有一件事,它应该连接到项目。您可以通过将以下代码添加到文件中来完成此操作(此处为<your_project_name>.csproj示例):

<PropertyGroup>
  <ApplicationManifest>app.manifest</ApplicationManifest>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

享受!

  • 如果您遇到 UWP 而不是 WPF 的问题,请执行相同的操作。它将修复此警告。 (2认同)