Поскольку Windows 8.1 не поддерживает общесистемную поддержку высокого разрешения в стиле Windows XP с высоким разрешением, как я могу сделать так, чтобы приложения консоли управления Microsoft (mmc.exe) поддерживали высокий уровень разрешения экрана? Для него нет пункта контекстного меню «Устранение неполадок совместимости».
Вкладка «Совместимость» скрыта для системных файлов, поэтому для воспроизведения функции флажка «Отключить масштабирование дисплея при высоких настройках разрешения» необходимо добавить в реестр следующее:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Windows\\System32\\mmc.exe"="~ HIGHDPIAWARE"
Это дает дополнительное преимущество, так как все оснастки MMC, такие как редактор групповой политики, также используют собственное масштабирование вместо размытой растеризованной версии.
Вы можете сохранить его как файл .reg и импортировать или использовать следующую команду для вставки в диалоговое окно «Выполнить»:
reg add "HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Windows\System32\mmc.exe" /f /t REG_SZ /d "~ HIGHDPIAWARE"
Если вы обнаружите, что часто используете этот обходной путь, вы можете добавить его в контекстное меню правой кнопки мыши для файлов .exe. Вы также можете добавить его в файлы .msi, поскольку вкладка «Совместимость» также отсутствует для этих файлов:
Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\exefile\shell\disabledpi]
[HKEY_CLASSES_ROOT\exefile\shell\disabledpi]
@="Disable DP&I Scaling"
[HKEY_CLASSES_ROOT\exefile\shell\disabledpi\command]
@="cmd /c @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\">nul"
"IsolatedCommand"="cmd /c @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\">nul"
[-HKEY_CLASSES_ROOT\Msi.Package\shell\disabledpi]
[HKEY_CLASSES_ROOT\Msi.Package\shell\disabledpi]
@="Disable DP&I Scaling"
[HKEY_CLASSES_ROOT\Msi.Package\shell\disabledpi\command]
@="cmd /c @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\">nul"
"IsolatedCommand"="cmd /c @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\">nul"
Поскольку параметры «Запуск от имени администратора» и «Отключить масштабирование DPI» хранятся вместе, вызов этой команды для файла, который уже настроен для запуска от имени администратора, сбросит этот флаг и вместо этого установит флаг масштабирования DPI. Это влияет только на файлы, для которых вы вручную установили флажок, а не на те, в манифесте которых указан правильный requiredExecutionLevel.
Просто для справки, когда оба отмечены, строка будет "~ RUNASADMIN HIGHDPIAWARE", но я бы не стал помещать это в параметр контекстного меню, поскольку он уже доступен для одноразового использования в контекстном меню, и не рекомендуется делать токен администратора нужен так легко.
Если вы хотите отключить масштабирование DPI для исполняемых файлов и файлов установщика в определенной папке, вы можете использовать следующий импорт .reg:
Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\Directory\shell\disabledpi]
[HKEY_CLASSES_ROOT\Directory\shell\disabledpi]
@="Disable DP&I Scaling"
[HKEY_CLASSES_ROOT\Directory\shell\disabledpi\command]
@="cmd /c @start /min cmd /c for /f \"usebackq delims=\" %%i in (`dir /b /s \"%1\\*.exe\" \"%1\\*.msi\"`) do @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%%i\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
"IsolatedCommand"="cmd /c @start /min cmd /c for /f \"usebackq delims=\" %%i in (`dir /b /s \"%1\\*.exe\" \"%1\\*.msi\"`) do @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%%i\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
Использование этой опции в папке корневого уровня, такой как Program Files, - плохая идея, потому что вы создадите сотни записей в реестре. Но в некоторых случаях это важно, особенно для Process Explorer и остальных утилит Sysinternals или утилит Nirsoft, все из которых отлично работают с отключенным масштабированием DPI, но не имеют опции, явно указанной в их манифестах.
В последнем пакете кода используется внутренняя команда запуска, чтобы как можно быстрее убрать окно командной строки с пути и сохранить его свернутым при анализе содержимого папки. Символ @ используется для предотвращения отражения команды в выводе, а перенаправление nul используется для скрытия вывода «Операция успешно завершена». для каждой записи, поскольку она никогда не меняется.
Если у вас есть отличный инструмент nircmd, вы можете полностью скрыть короткую вспышку окна командной строки:
Windows Registry Editor Version 5.00
[-HKEY_CLASSES_ROOT\exefile\shell\disabledpi]
[HKEY_CLASSES_ROOT\exefile\shell\disabledpi]
@="Disable DP&I scaling"
[HKEY_CLASSES_ROOT\exefile\shell\disabledpi\command]
@="nircmd.exe execmd reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
"IsolatedCommand"="nircmd.exe execmd reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
[-HKEY_CLASSES_ROOT\Msi.Package\shell\disabledpi]
[HKEY_CLASSES_ROOT\Msi.Package\shell\disabledpi]
@="Disable DP&I scaling"
[HKEY_CLASSES_ROOT\Msi.Package\shell\disabledpi\command]
@="nircmd.exe execmd reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
"IsolatedCommand"="nircmd.exe execmd @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%1\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
[-HKEY_CLASSES_ROOT\Directory\shell\disabledpi]
[HKEY_CLASSES_ROOT\Directory\shell\disabledpi]
@="Disable DP&I scaling"
[HKEY_CLASSES_ROOT\Directory\shell\disabledpi\command]
@="nircmd.exe execmd for /f \"usebackq delims=\" %%i in (`dir /b /s \"%1\\*.exe\" \"%1\\*.msi\"`) do @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%%i\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
"IsolatedCommand"="nircmd.exe execmd for /f \"usebackq delims=\" %%i in (`dir /b /s \"%1\\*.exe\" \"%1\\*.msi\"`) do @reg add \"HKCU\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers\" /v \"%%i\" /f /t REG_SZ /d \"~ HIGHDPIAWARE\""
Если nircmd.exe отсутствует на вашем пути, вы можете либо добавить его расположение выше, либо добавить его папку к своему пути в диалоговом окне «Переменные системной среды». Чтобы открыть это окно, вы можете использовать команду rundll32 sysdm.cpl,EditEnvironmentVariables
Можно было бы привести аргумент, что было бы более элегантно добавить ключи реестра, создав файл .reg во время выполнения и импортировав его незаметно с недокументированным reg import /s
вариант. Но по моему опыту, запись любых файлов во время выполнения вызывает всевозможные тревоги с продуктами безопасности, такими как COMODO Internet Securita, его эквивалентные версии от Panda, Norton и т. Д., И все, что основано на модели HIPS. Я не вижу необходимости делать это, когда все вышесказанное работает нормально, особенно если вы используете это на нескольких компьютерах или делитесь им и не хотите создавать ложную тревогу для кого-то еще.
Однако, если вы уже используете nircmd, имеет смысл использовать его regsetval
команда вместо reg add
для расширений оболочки .exe и .msi. Параметр папки все равно должен будет перебирать список каталогов, чтобы добавить каждую запись, поэтому он не будет работать для них. PowerShell и VBScript - это варианты, но их доступность зависит от версии Windows и множества других переменных. С точки зрения безопасности VBScript имеет репутацию вектора эксплойтов, особенно при загрузке из Интернета или совместном использовании в сети, а сценарии PS1 вообще не будут запускаться без явной настройки политики выполнения PowerShell, разрешающей удаленные подписанные сценарии.
Дайте мне знать, если вы заметите что-нибудь странное при использовании этого кода, поскольку он все еще находится в стадии разработки. При этом это должно значительно упростить настройку параметров DPI в Windows 8.1.
В Windows 10 вы можете добиться того же эффекта, выполнив следующие действия:
1: В зависимости от того, какая у вас сборка (чтобы найти ее, нажмите Windows + R, введите «winver», нажмите Enter) либо:
Введите уровень масштабирования вручную, даже если он доступен в раскрывающемся списке. Вы узнаете, что сделали это правильно, если вам будет предложено выйти из системы, чтобы настройки вступили в силу.
2: Сохраните следующее в файл .reg на рабочем столе и дважды щелкните его, чтобы добавить содержимое в реестр:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide]
"PreferExternalManifest"=dword:00000001
3: Сохраните следующий файл как c:\windows\system32\mmc.exe.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
<assemblyIdentity
processorArchitecture="x86"
version="5.1.0.0"
name="Microsoft.Windows.MMC"
type="win32"
/>
<description>Microsoft Management Console</description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="highestAvailable"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>True/PM</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>
4: Откройте любые окна MMC (Службы, Диспетчер устройств и т. Д.), И теперь они будут больше и четче.