Моего приложения является DPI-Aware, вот полный манифест:Не удается получить NotifyIcon загрузить высокий DPI ресурс DPI масштабирования> = 150%
<?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)
Однако, это не работает для масштабирования DPI, равного или выше 150% в моей системе Windows 8.1. Когда он установлен на 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.
Сильный намек на то, что ваш манифест на самом деле не выполняет свою работу. Вы можете вывести IsProcessDPIAware() для двойной проверки. Следите за хостингом Visual Studio, отключите его с помощью Project + Properties, вкладки Debug. –
@HansPassant Я добавил '[DllImport (« user32.dll », CharSet = CharSet.Auto, SetLastError = true)] внутренний статический extern bool IsProcessDPIAware();' и он возвращает 'true' все время, даже если я удалите весь файл манифеста. –