【问题标题】:PowerShell script returning the wrong screen resolutionPowerShell 脚本返回错误的屏幕分辨率
【发布时间】:2016-03-12 21:49:10
【问题描述】:

我刚刚编写了一个简单的 PowerShell 脚本来获取显示器的屏幕分辨率,但它似乎返回了错误的值。

# Returns an screen width and screen height of maximum screen resolution
function Get-ScreenSize {
    $screen = [System.Windows.Forms.Screen]::PrimaryScreen
    $width  = $screen.Bounds.Width
    $height = $screen.Bounds.Height
    return $width, $height
}

Get-ScreenSize

我在分辨率设置为 3840 x 2160 的 4k 显示器上运行此脚本,但它给了我以下输出:

1536

864

有什么会导致System.Windows.Forms.Screen 得到错误的“Bounds”值吗?

【问题讨论】:

  • 当使用WorkingArea 而不是Bounds 属性时,您会得到什么值?
  • 我得到 3840 x 2060 非常接近,但仍然不太正确。
  • 看起来是正确的。全宽,全高减去任务栏。
  • 好的,嗯,那我想知道为什么 bounds 返回了错误的值...
  • 查看Screen 的参考实现,看起来Bounds 使用虚拟屏幕大小(虽然不完全确定,为什么数字小于预期),而WorkingArea 使用多显示器 API。不过,我不知道如何修复 PowerShell commandlet。

标签: winforms powershell winapi screen-resolution


【解决方案1】:

嗯,我并没有完全弄清楚为什么我会得到如此奇怪的结果......但我确实找到了另一种实际上看起来更简单且似乎准确的方法。

$vc = Get-WmiObject -class "Win32_VideoController"
$vc.CurrentHorizontalResolution
$vc.CurrentVerticalResolution

这将打印当前的屏幕分辨率,并且似乎为我提供了我真正想要的准确结果。如果有人弄清楚是什么可能导致另一种方法产生不准确的结果,我仍然很想知道为什么会发生这种情况......

【讨论】:

    【解决方案2】:

    这是因为该命令为您提供了缩放的分辨率。如果您运行的是 3840 x 2160 但不是以 100% 缩放运行,您将获得不同的值。

    【讨论】:

    • 这很有趣,但我想如果这是应用程序内部用来正确扩展自身的命令,那是有道理的。
    【解决方案3】:

    这很奇怪。

    为什么微软只为服务器核心提供Get-DisplayResolution cmdlet?

    该版本没有开始按钮......并且根据上面对返回的显示大小的评论(减去开始栏);听到 cmdlet 使用相同的 .NET 代码库,我不会感到惊讶。

    在我的 HKLM\SYSTEM\CurrentControlSet\Control 中快速搜索列出了监视器的几个键和每个屏幕的值,但没有任何用处。


    编辑:见Q7967699

    PS D:\Scripts> Add-Type -AssemblyName System.Windows.Forms
    
    PS D:\Scripts> [System.Windows.Forms.Screen]::AllScreens
    
    
    BitsPerPixel : 32
    Bounds       : {X=0,Y=0,Width=3840,Height=2160}
    DeviceName   : \\.\DISPLAY1
    Primary      : True
    WorkingArea  : {X=0,Y=0,Width=3840,Height=2120}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 2016-02-14
      • 1970-01-01
      相关资源
      最近更新 更多