由于 Windows 8.1 不允许系统范围的“Windows XP 风格”高 DPI 支持,我该如何让 Microsoft 管理控制台应用程序 (mmc.exe) 感知高 DPI?没有“疑难解答兼容性”上下文菜单项。
答案1
兼容性选项卡对于系统文件是隐藏的,因此要复制“在高 DPI 设置上禁用显示缩放”复选框的功能,您需要将以下内容添加到注册表中:
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 缩放标志。这只会影响您手动选中复选框的文件,而不会影响清单中具有正确 requestedExecutionLevel 的文件。
仅供参考,当检查两者时,字符串是“〜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 shell 扩展名是有意义的。文件夹选项仍然需要遍历目录列表以添加每个条目,因此它不适用于这些。PowerShell 和 VBScript 是选项,但它们的可用性取决于 Windows 的版本和许多其他变量。从安全角度来看,VBScript 以漏洞利用媒介而闻名,尤其是在从互联网下载或在网络上共享时,并且如果不明确设置 PowerShell 的执行策略以允许远程签名脚本,PS1 脚本根本无法运行。
如果您在使用该代码时发现任何异常,请告诉我,因为它仍在进行中。话虽如此,它应该会使配置 Windows 8.1 的 DPI 设置变得更容易。
答案2
在 Windows 10 上,你可以通过执行以下操作来实现相同的效果:
1:取决于您拥有的版本(要找到它,请按 Windows+R,输入“winver”,按 Enter 键):
- 在版本 15019 之前:打开控制面板、显示、更改项目大小,设置自定义缩放级别
- build 15019 或更高版本:打开“设置”、“系统”、“显示”、“自定义缩放”
手动输入缩放级别,即使下拉菜单中提供了该级别。如果系统提示您退出以使设置生效,则表明您已正确完成操作。
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 窗口(服务、设备管理器等),它们现在会变得更大、更清晰