不需注销即可启用/禁用ClearType

12

我需要通过cmd(或任何VBS/JS等脚本)或从注册表中启用/禁用 ClearType(或“调整 Windows 外观和性能 > 平滑屏幕字体边缘”),而无需注销或重新启动 Windows。

也许可以仅为一个应用程序启用 ClearType。

8个回答

16

在Windows下编写脚本的现代方式是使用PowerShell。以下脚本需要2.0版本,该版本可从Windows XP SP3获取:

#requires -version 2.0
param([bool]$enable)

$signature = @'
[DllImport("user32.dll")]
public static extern bool SystemParametersInfo(
    uint uiAction,
    uint uiParam,
    uint pvParam,
    uint fWinIni);
'@

$SPI_SETFONTSMOOTHING      = 0x004B
$SPI_SETFONTSMOOTHINGTYPE  = 0x200B
$SPIF_UPDATEINIFILE        = 0x1
$SPIF_SENDCHANGE           = 0x2
$FE_FONTSMOOTHINGCLEARTYPE = 0x2

$winapi = Add-Type -MemberDefinition $signature -Name WinAPI -PassThru

if ($enable)
{
    [void]$winapi::SystemParametersInfo($SPI_SETFONTSMOOTHING, 1, 0, $SPIF_UPDATEINIFILE -bor $SPIF_SENDCHANGE)
    [void]$winapi::SystemParametersInfo($SPI_SETFONTSMOOTHINGTYPE, 0, $FE_FONTSMOOTHINGCLEARTYPE, $SPIF_UPDATEINIFILE -bor $SPIF_SENDCHANGE)
}
else
{
    [void]$winapi::SystemParametersInfo($SPI_SETFONTSMOOTHING, 0, 0, $SPIF_UPDATEINIFILE -bor $SPIF_SENDCHANGE)
}

如果由于某种原因无法使用PowerShell,那么您需要 DynamicWrapperX 来在WSH中执行WinAPI函数。 您需要先在目标计算机上注册它,然后可以使用以下VBScript:

Set WinAPI = CreateObject("DynamicWrapperX")
WinAPI.Register "user32.dll", "SystemParametersInfo", "i=uuuu"

Const SPI_SETFONTSMOOTHING      = &H004B
Const SPI_SETFONTSMOOTHINGTYPE  = &H200B
Const SPIF_UPDATEINIFILE        = &H1
Const SPIF_SENDCHANGE           = &H2
Const FE_FONTSMOOTHINGCLEARTYPE = &H2

If WScript.Arguments(0) Then
    WinAPI.SystemParametersInfo SPI_SETFONTSMOOTHING, 1, 0, SPIF_UPDATEINIFILE Or SPIF_SENDCHANGE
    WinAPI.SystemParametersInfo SPI_SETFONTSMOOTHINGTYPE, 0, FE_FONTSMOOTHINGCLEARTYPE, SPIF_UPDATEINIFILE Or SPIF_SENDCHANGE
Else
    WinAPI.SystemParametersInfo SPI_SETFONTSMOOTHING, 0, 0, SPIF_UPDATEINIFILE Or SPIF_SENDCHANGE
End If

两个脚本都接受一个参数,0表示禁用ClearType,1表示启用。无需重新启动。


我需要复制这个内容然后插入并按回车键,还是需要将其保存到某个 PowerShell 可执行脚本文本文件中,然后双击运行? - user1306322
@user1306322,你可以将脚本复制并保存为.ps1文件。然后你可以在命令行中运行它,例如powershell "& 'C:\myscript.ps1' 1"。不过也有可能调整系统注册表,这样你就可以双击该文件来运行它。 - skink
2
@user1306322,Set-ExecutionPolicy Unrestricted -Force应该允许运行所有脚本,但是Set-ExecutionPolicy RemoteSigned可能更安全。请参阅:https://dev59.com/kG855IYBdhLWcg3w_5qm - skink
谢谢,现在它可以工作了,但是禁用所有字体平滑的命令行是 powershell "& 'C:\myscript.ps1' 0" - user1306322
我简直不敢相信这个还没有得到更多的赞。太棒了!我也喜欢在PowerShell中使用动态添加类型的方法。 - Joshua Honig
显示剩余2条评论

7

为了提供更多的选项,我有C#版本,在其中添加了GetFontSmoothing。

    [DllImport("user32.dll", SetLastError = true)]
    static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int pvParam, uint fWinIni);

    const uint SPI_GETFONTSMOOTHING = 74;
    const uint SPI_SETFONTSMOOTHING = 75;
    const uint SPI_UPDATEINI = 0x1;
    const UInt32 SPIF_UPDATEINIFILE = 0x1;

    private Boolean GetFontSmoothing()
    {
        bool iResult;
        int pv = 0;
        /* Call to systemparametersinfo to get the font smoothing value. */
        iResult = SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, ref pv, 0);
        if (pv > 0)
        {
            //pv > 0 means font smoothing is on.
            return true;
        }
        else
        {
            //pv == 0 means font smoothing is off.
            return false;
        }
    }

    private void DisableFontSmoothing()
    {
        bool iResult;
        int pv = 0;
        /* Call to systemparametersinfo to set the font smoothing value. */
        iResult = SystemParametersInfo(SPI_SETFONTSMOOTHING, 0, ref pv, SPIF_UPDATEINIFILE);
        Console.WriteLine("Disabled: {0}", iResult);
    }

    private void EnableFontSmoothing()
    {
        bool iResult;
        int pv = 0;
        /* Call to systemparametersinfo to set the font smoothing value. */
        iResult = SystemParametersInfo(SPI_SETFONTSMOOTHING, 1, ref pv, SPIF_UPDATEINIFILE);
        Console.WriteLine("Enabled: {0}", iResult);
    }

1
谢谢Carol。我们已经实现了一个客户端应用程序,可以在超过3k台机器上运行,并且我将使用您的解决方案,它完全完美地工作。 - Mumin Ka

3

Python 版本:

# make sure you install pywin32 
# from http://sourceforge.net/projects/pywin32/files/pywin32/Build%20218/
import win32con
import win32gui

win32gui.SystemParametersInfo(win32con.SPI_SETFONTSMOOTHING, True, 0) # enable only
win32gui.SystemParametersInfo(win32con.SPI_SETFONTSMOOTHINGTYPE,
        win32con.FE_FONTSMOOTHINGCLEARTYPE,
        win32con.SPIF_UPDATEINIFILE | win32con.SPIF_SENDCHANGE)

2

制作扩展名为.reg的文件,这是文件注册表。

禁用屏幕字体的平滑边缘。

[HKEY_CURRENT_USER\Control Panel\Desktop]
"FontSmoothing"="0"

启用屏幕字体的平滑边缘

[HKEY_CURRENT_USER\Control Panel\Desktop]
"FontSmoothing"="2"

您也可以通过命令行完成此操作。以下是命令的语法:

REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]

您必须注销才能使您所做的更改生效


2

2
以下对我有效: 控制面板 > 系统 > 高级系统设置 > 高级 > (性能)设置 > 视觉效果 > 选择“自定义”并取消选中“平滑屏幕字体边缘”。

1
这是一个使用PowerShell的方法:
Set-ItemProperty 'HKCU:\Control Panel\Desktop\' -Name FontSmoothing -Value "2"

为使更改生效,您需要注销并重新登录。

注意:奇怪的是,即使已明确打开,设置在性能选项中也不会显示为已启用:

enter image description here


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接