2015-02-21 2 views
0

Моего приложения является 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.

+0

Сильный намек на то, что ваш манифест на самом деле не выполняет свою работу. Вы можете вывести IsProcessDPIAware() для двойной проверки. Следите за хостингом Visual Studio, отключите его с помощью Project + Properties, вкладки Debug. –

+0

@HansPassant Я добавил '[DllImport (« user32.dll », CharSet = CharSet.Auto, SetLastError = true)] внутренний статический extern bool IsProcessDPIAware();' и он возвращает 'true' все время, даже если я удалите весь файл манифеста. –

ответ

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, выберите файл .exe из каталога bin/Debug. Открыл узел RT_MANIFEST и дважды щелкнул ресурс # 1. Это было просто по умолчанию, которое компилятор автоматически генерирует, а не измененный из файла app.manifest.

Так вот почему это не работает. У меня нет фантастической теории, как это произошло, возможно, вы добавили ее вручную. Вы исправите его, щелкнув правой кнопкой мыши app.manifest в окне Solution Explorer и удалив его. Теперь используйте Project> Добавить новый элемент> Общие> Файл манифеста приложений. Вставьте изменения еще раз.

+0

Я могу проверить это позже сегодня вечером, но это именно то, что я сделал в первую очередь ...'Project> Добавить новый элемент> Application Manifest', я не знаю, почему файл' SlackUI.csproj' выглядит не так, как должен ... –

Смежные вопросы