首页 > 解决方案 > PowerShell - DPI 感知表单

问题描述

大家好,我很好奇在 PowerShell 中创建 Winform DPI 时如何使其具有感知能力?或者至少,防止它自动缩放。我已经用谷歌搜索并搜索和搜索,但我似乎无法找到答案或如何做到这一点的例子。最常见的答案是将其包含在清单中,但这对于 PowerShell 来说不是一个可行的选择。

如果有的话,我只是想阻止 Windows 自动重新调整 DPI 高于 96 (100%) 的表单。我尝试了AutoScaleMode = "DPI",但不幸的是它不起作用并且似乎没有做任何事情,因为将其设置为 "None" 或根本不包括它是相同的结果。

一个简单的例子......

Add-Type -AssemblyName 'System.Windows.Forms'
Add-Type -AssemblyName 'System.Drawing'

$Dialog = New-Object Windows.Forms.Form
$Dialog.Text = 'Main'
$Dialog.Size = New-Object Drawing.Size(200, 100)
$Dialog.AutoScaleMode = "DPI"

$Label = New-Object Windows.Forms.Label
$Label.Size = New-Object Drawing.Size(200, 16)
$Label.Location = New-Object Drawing.Size(10, 20)
$Label.Text = 'This text is to test autoscaling.'
$Dialog.Controls.Add($Label)

$Dialog.ShowDialog()

左边的图像是自动缩放和模糊的。我不想要这个,我希望它看起来像正确的。如果我能做到这一点,我会尝试弄清楚我将如何处理缩放。

标签: winformspowershell

解决方案


因此,我确实设法偶然找到了解决方法。我正在研究 WPF 表单(我对此知之甚少)并遇到了一个示例。在 WPF 中添加一个从未实际显示的最小虚拟窗口,以某种方式阻止 winforms 自动缩放。

# Load assemblies.
Add-Type -AssemblyName 'System.Windows.Forms'
Add-Type -AssemblyName 'System.Drawing'
Add-Type -AssemblyName 'PresentationFramework'

# Dummy WPF window (prevents auto scaling).
[xml]$Xaml = @"
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="Window">
</Window>
"@
$Reader = (New-Object System.Xml.XmlNodeReader $Xaml)
$Window = [Windows.Markup.XamlReader]::Load($Reader)

# Business as usual.
$Dialog = New-Object Windows.Forms.Form
$Dialog.Text = 'Main Window'
$Dialog.Size = New-Object Drawing.Size(200, 100)

$Label = New-Object Windows.Forms.Label
$Label.Size = New-Object Drawing.Size(200, 16)
$Label.Location = New-Object Drawing.Size(10, 20)
$Label.Text = 'This text is to test autoscaling.'
$Dialog.Controls.Add($Label)

$Dialog.ShowDialog()

推荐阅读