12

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

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

4

8 回答 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表示启用。无需重新启动。

于 2012-12-22T16:22:22.690 回答
8

只是为了添加更多选项,我有 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);
    }
于 2016-09-07T15:28:00.220 回答
3

蟒蛇版本:

# 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)
于 2013-03-20T11:09:36.547 回答
2

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

于 2011-10-03T08:33:15.567 回答
2

我不知道如何在不重新启动的情况下做到这一点......

但我发现改变 FontSmoothing 键是不够的......

有关如何完全删除 ClearType 和 FontSmoothing 的完整过程,请查看:

在 Windows 7 中完全禁用字体平滑和 ClearType

于 2011-06-22T00:19:52.257 回答
2

制作带有扩展名的文件。reg这是文件的注册表

Disable_Smooth_edges_of_screen_fonts

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

Enable_Smooth_edges_of_screen_fonts

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

您也可以通过 cmd 执行此操作,这是命令的语法

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

您必须注销才能使您更改

于 2011-04-15T12:42:22.263 回答
1

查看以下链接中描述的内容:

http://www.vbforums.com/showthread.php?t=491091

调用 API 可能会触发系统范围的更新,因此您不必注销/登录即可看到更改。

当然,这不仅限于vb.net。

于 2012-05-31T13:03:34.457 回答
1

这是执行此操作的 PowerShell 方法:

Set-ItemProperty 'HKCU:\Control Panel\Desktop\' -Name FontSmoothing -Value "2"

您需要注销并重新登录才能生效。

注意:奇怪的是,该设置并未在“性能选项”中显示为已启用,即使它已明确打开:

在此处输入图像描述

于 2019-02-17T23:07:17.130 回答