12

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

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

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

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

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

我该如何开始?如果这是可能的。

4

9 回答 9

10

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

有关所有 DPI 相关注册表设置的更多信息,请参阅DPI 相关 API 和注册表设置

我编写了一个小型 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
于 2014-12-31T12:00:00.057 回答
4

显然你可以设置的LogPixels属性

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

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

于 2012-05-01T08:06:38.070 回答
2

对不起,我误读了这个问题。我以为你想控制 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 上有一个很好的介绍。

于 2012-05-01T07:44:07.137 回答
1

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

$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}
于 2018-10-01T11:43:37.807 回答
1

@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
于 2018-04-02T16:31:38.160 回答
0

通过比较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.'
于 2019-03-21T15:59:28.333 回答
0

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

你可以这样称呼它

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
    }
于 2021-07-01T18:33:24.343 回答
0

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

设置缩放-缩放 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
    }
于 2021-08-12T15:26:11.727 回答
-7

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

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

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

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

    设置执行策略 remotesigned .\Install-WMF5.1.ps1

于 2018-06-04T18:36:17.177 回答