无法让NotifyIcon为DPI扩展加载高DPI资源> = 150%

时间:2015-02-21 16:49:42

标签: c# .net notifyicon dpi-aware

我的应用程序是DPI-Aware,这是完整的清单:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
                manifestVersion="1.0">
    <assemblyIdentity name="SlackUI"
                      type="win32"
                      version="1.0.0.0" />
    <asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
        <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
            <dpiAware>true</dpiAware>
        </asmv3:windowsSettings>
    </asmv3:application>
</asmv1:assembly>

我正在设置我的NotifyIcon图标属性:

notifyIcon.Icon = new Icon(Program.Settings.Data.WhiteNotificationIcon ?
                Properties.Resources.NotifyWhite : Properties.Resources.NotifyColor, SystemInformation.SmallIconSize)

但是,在我的Windows 8.1系统上,这不适用于DPI扩展等于或高于150%。如果设置为100%SystemInformation.SmallIconSize报告16x16大小(正确),当它为125%时报告20x20大小(正确),高于该大小(例如150%),它应报告24x24大小但报告16x16并从我的图标文件加载错误的分辨率。

阅读以下文章(http://blog.quppa.net/2011/01/07/small-icon-size-dpi-in-windows/),它告诉我......

  

WPF和WinForms都围绕着Win32 GetSystemMetrics函数   取参数SM_CXSMICON(小图标宽度)和SM_CYSMICON   (小图标高度)。

这意味着我可能不需要自己拨打GetSystemMetrics,对吧?

关于如何解决这个问题的任何想法?

P.S:我说的是我正在开发的一个开源应用程序,所以如果你想仔细查看完整的源代码,你可以这样做here

1 个答案:

答案 0 :(得分:1)

  

强烈暗示你的清单实际上并没有完成它的工作

不是。从您的github SlackUI / SlackUI.csproj文件:

<ItemGroup>
  <None Include="app.manifest">
    <SubType>Designer</SubType>
  </None>
</ItemGroup>

应该的样子是:

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

请注意高度特定的<ApplicationManifest>元素,让MSBuild知道这应该是可执行文件的清单。我通过将其粘贴到.csproj文件,构建然后使用File + Open + File测试您的版本,从bin / Debug目录中选择.exe文件。打开RT_MANIFEST节点并双击资源#1。它只是编译器自动生成的默认值,而不是app.manifest文件中的修改版本。

这就是为什么它不起作用。我没有奇妙的理论如何发生这种情况,也许你是手工添加它。您可以通过右键单击解决方案资源管理器窗口中的app.manifest并将其删除来修复它。现在使用Project&gt;添加新项&gt;一般&gt;应用程序清单文件。再次粘贴更改。