【问题标题】:Change "Windows font size (DPI)" in PowerShell?在 PowerShell 中更改“Windows 字体大小 (DPI)”?
【发布时间】:2012-05-09 01:45:17
【问题描述】:

我在办公室使用笔记本电脑 (Windows 7),带有工作站和双屏,而在家里则没有工作站。

关键是我每次从工作站切换到独立笔记本电脑时都必须更改文本大小,因为我的双屏上的文本大小太大,但在我的笔记本电脑屏幕上却太小了。

继续: 我右键单击桌面屏幕,选择更改分辨率,然后“让文本和其他元素变大或变小”以选择 100%、125% 等... 我需要重新启动会话以应用设置。 (注意:我使用的是法语系统,我想我们版本的文本并不完全相同)。

这不是很方便,所以我想自动化它,也许使用 PowerShell 脚本。

理想情况下,该脚本可以检测我是单独使用笔记本电脑还是带有两个屏幕的工作站)。另外,无需重新启动会话(我怀疑最后一点是否可行)。

我该如何开始?如果可以的话。

【问题讨论】:

  • 即使使用 powershell,您也需要重新启动会话。我怀疑这只是一个注册表设置;如果是这样,它可能会在您的环境中定期被覆盖。 (在这种情况下,这听起来像是一个远程配置文件只是在做这件事。)

标签: powershell windows-7 automation


【解决方案1】:

喜欢这个答案,有人知道如何设置单个显示器而不是同时设置所有显示器吗?我有 3 台显示器,这是一个普遍的变化。

Set-Scaling - 缩放 0

function Set-Scaling {
    # Posted by IanXue-MSFT on
    # https://docs.microsoft.com/en-us/answers/questions/197944/batch-file-or-tool-like-powertoy-to-change-the-res.html
    # $scaling = 0 : 100% (default)
    # $scaling = 1 : 125% 
    # $scaling = 2 : 150% 
    # $scaling = 3 : 175% 
    param($scaling)
$source = @’
    [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
    public static extern bool SystemParametersInfo(
                      uint uiAction,
                      uint uiParam,
                      uint pvParam,
                      uint fWinIni);
‘@
    $apicall = Add-Type -MemberDefinition $source -Name WinAPICall -Namespace SystemParamInfo –PassThru
    $apicall::SystemParametersInfo(0x009F, $scaling, $null, 1) | Out-Null
    }

【讨论】:

    【解决方案2】:

    这是我发现的最直接的方法。我稍微修改了提供的功能,因此它很容易复制/粘贴。它不需要任何注册表调用或任何东西。简单且非常有效。

    你可以这样称呼它

    Set-Scaling -scaling 0
    
    function Set-Scaling {
        # Posted by IanXue-MSFT on
        # https://docs.microsoft.com/en-us/answers/questions/197944/batch-file-or-tool-like-powertoy-to-change-the-res.html
        # $scaling = 0 : 100% (default)
        # $scaling = 1 : 125% 
        # $scaling = 2 : 150% 
        # $scaling = 3 : 175% 
        param($scaling)
        $source = @’
        [DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
        public static extern bool SystemParametersInfo(
                          uint uiAction,
                          uint uiParam,
                          uint pvParam,
                          uint fWinIni);
        ‘@
        $apicall = Add-Type -MemberDefinition $source -Name WinAPICall -Namespace SystemParamInfo –PassThru
        $apicall::SystemParametersInfo(0x009F, $scaling, $null, 1) | Out-Null
        }
    

    【讨论】:

      【解决方案3】:

      通过比较Get-ItemProperty -Path 'HKCU:\Control Panel\Desktop'在使用Windows GUI设置缩放级别前后的输出,我发现需要设置以下属性;为我工作:

      cd 'HKCU:\Control Panel\Desktop'
      Set-ItemProperty -Path . -Name LogPixels -Value 144
      Set-ItemProperty -Path . -Name Win8DpiScaling -Value 1
      Set-ItemProperty -Path . -Name FocusBorderHeight -Value 2
      Set-ItemProperty -Path . -Name FocusBorderWidth -Value 2
      Write-Host 'Sign out and sign back in again to see changes.'
      

      【讨论】:

        【解决方案4】:

        经过很长时间,我在谷歌上找不到任何东西。 好吧,我制作了自己的脚本:

        $perfis = (Get-ChildItem Registry::HKEY_USERS\ | Where-Object {$_.Name -match "S-1"} | ForEach-Object {Get-ItemProperty "Registry::$_\Control Panel\Desktop" -Name "Win8DpiScaling" -ErrorAction SilentlyContinue}).PSPath
        foreach ($_ in $perfis) {Set-ItemProperty -Path "Registry::$_" -Name "Win8DpiScaling" -Value 0}
        
        $monitores = (Get-ChildItem Registry::HKEY_USERS\ | Where-Object {$_.Name -match "S-1"} | ForEach-Object {Get-ChildItem "Registry::$_\Control Panel\Desktop\PerMonitorSettings" -ErrorAction SilentlyContinue}).PSPath
        foreach ($_ in $monitores) {Set-ItemProperty -Path "Registry::$_" -Name "DpiValue" -Value 0}
        

        【讨论】:

          【解决方案5】:

          正如其他答案中所假设的,HKLM 下的设置不是正确的位置,因为 dpi 缩放是用户定义的设置。正确的注册表项是HKCU:\Control Panel\Desktop,其值为LogPixels

          关于所有 DPI 相关的注册表设置的更多信息可以在 DPI-related APIs and registry settings 中找到。

          我编写了一个小型 PowerShell 脚本,它根据当前缩放更改 DPI 缩放并执行用户注销,因此当我将设备放到不同的监视器上时只需执行该脚本。

          cd 'HKCU:\Control Panel\Desktop'
          $val = Get-ItemProperty -Path . -Name "LogPixels"
          if($val.LogPixels -ne 96)
          {
              Write-Host 'Change to 100% / 96 dpi'
              Set-ItemProperty -Path . -Name LogPixels -Value 96
          } else {
              Write-Host 'Change to 150% / 144 dpi'
              Set-ItemProperty -Path . -Name LogPixels -Value 144
          }
          
          logoff;exit
          

          【讨论】:

          • 这太棒了!在 Windows 8 上,logoff 不起作用,所以我将其更改为 shutdown /L
          • 在 Windows 10 20H2 上,GPU 显卡不工作。
          • 这适用于任何尺寸的显示器吗?我在更高分辨率的显示器上发现了 192 的设置,这对应于 100 DPI。分辨率设置为 1024x768,原始分辨率为 2736 x 1824。谢谢
          • @dgm Dpi 缩放始终是一个主观设置。您应该应用一个可以在显示器上提供最佳可读性和可缩放性的值。我建议您首先尝试使用普通的 Windows 设置应用程序在 HiRes 显示器上进行缩放。然后您将脚本中的-Value 144 更改为您找到的缩放值,其中 96 对应于 100% 缩放,例如150% 对应于 144、175% => 168 等值。
          • Microsoft Documentation 关于这个问题。
          【解决方案6】:

          对不起,我误读了这个问题。我以为你想控制 PowerShell 窗口。

          如前所述,您可以在注册表中设置 LogPixels 设置,以查看当前设置是什么,试试这个:

          Get-Item -Path Registry::'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI' | Select-Object -ExpandProperty Property
          

          如果有 LogPixels 键,它会显示,如果它不存在,您可以创建它:

          Set-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontDPI\LogPixels'
          

          注意:您必须使用允许您操作注册表的权限运行此程序。

          在 TechNet 上有一个很好的 introduction

          【讨论】:

          • 这只是 PowerShell 主机应用程序。它与 Windows 设置无关。
          【解决方案7】:

          这些简单的步骤对我有用:

          1. https://docs.microsoft.com/en-us/powershell/wmf/5.1/install-configure下载Win7AndW2K8R2-KB3191566-x64.ZIP

          2. 解压tmp文件夹中的文件

          3. 以管理员身份打开Powershell命令窗口,进入解压后的tmp文件夹,执行以下命令:

            set-executionpolicy remotesigned .\Install-WMF5.1.ps1

          【讨论】:

          • 解释这与提出的问题有什么关系。
          • 安装 Windows Management Framework 与原问题无关。不知道为什么要在这个问题中添加它?
          【解决方案8】:

          @Torben Schramme 我发现我必须为这项工作再添加一个 ItemProperty Win8DpiScaling。但是,我发现“注销;退出”功能不起作用 - 我仍然需要手动操作。

          cd 'HKCU:\Control Panel\Desktop'
          $val = Get-ItemProperty -Path . -Name "LogPixels"
          if($val.LogPixels -ne 96)
          {
               Write-Host 'Change to 100% / 96 dpi'
               Set-ItemProperty -Path . -Name LogPixels -Value 96
               Set-ItemProperty -Path . -Name Win8DpiScaling 0
          } else {
               Write-Host 'Change to 150% / 144 dpi'
               Set-ItemProperty -Path . -Name LogPixels -Value 144
               Set-ItemProperty -Path . -Name Win8DpiScaling 1
          }
          logoff;exit
          

          【讨论】:

          • 看起来你只是复制了已经给出的答案。
          • 我增强了答案。您需要添加 Win8DpiScaling。
          • 如果您要达到 100%,可能需要额外的一行。但就我而言,我在 150% 和 250% 之间变化,所以我一直打开 Win8DpiScaling。我不确定它有什么不同。
          【解决方案9】:

          显然你可以设置LogPixels的属性

          HKLM:/Software/Microsoft/Windows NT/CurrentVersion/FontDPI
          

          这在网络上的很多地方都得到了重申。但是,我觉得 dpi 是一种用户设置,在 HKLM 下没有任何意义。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-31
            • 2011-06-25
            相关资源
            最近更新 更多