如何修改我的.NET 4.8 WPF应用程序的DPI感知设置?

后端开发 2026-07-11

当然,这个我早就上网查过了。于是我把app.manifest加上 标签放到项目里,并在项目文件中引用了它。这个标签也在编译输出文件夹中的myApp.exe.manifest文件里找到。我也尝试了不带 "V2" 的 “PerMonitor”,但GetProcessDpiAwareness和 GetAwarenessFromDpiAwarenessContext仍然提示应用处于 “system” 感知模式,而不是 “per monitor”。在某些情况下,我添加了我自己的Main() 函数(并在项目设置中选择它),在其中调用了SetProcessDpiAwarenessContext或 SetProcessDpiAwareness,但也不起作用。

  <application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
    </windowsSettings>
  </application>

也许不起作用是因为我引用了WinRT、Win2D,并且我有一个MSIX打包项目?

解决方案

我终于自己找到了答案。
问题在于MSIX项目不会把我的EXE项目输出文件夹中的manifest文件拷贝到打包输出文件夹中。因此所有manifest设置都会丢失。

解决办法是将manifest嵌入到MyApp.exe文件中,而不是在输出文件夹里放一个MyApp.exe.manifest文件(它是app.manifest的拷贝)。这可以通过编辑MyApp.csproj文件来实现。
它包含如下内容:

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

只需要再插入一行(使用文本编辑器,因为这个选项在VS 2026的项目设置中不可用):

  <PropertyGroup>
    <ApplicationManifest>app.manifest</ApplicationManifest>
    <GenerateManifests>false</GenerateManifests>
  </PropertyGroup>
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章