[英]Disable high DPI scaling
我想在启用屏幕缩放时从我的代码中获取正确的数据。 所以我使用SetProcessDPIAware()函数:
using namespace System.Windows.Forms
Clear-Host
Add-Type -AssemblyName System.Windows.Forms
Add-Type -Name User32 -Namespace W32 '
[DllImport("user32.dll")]
public static extern bool SetProcessDPIAware();'
[Cursor]::Position | Write-Host
[Screen]::PrimaryScreen.Bounds.Size | Write-Host
[SystemInformation]::PrimaryMonitorSize | Write-Host
[W32.User32]::SetProcessDPIAware()
[Cursor]::Position | Write-Host
[Screen]::PrimaryScreen.Bounds.Size | Write-Host
[SystemInformation]::PrimaryMonitorSize | Write-Host
输出:
{X=630,Y=313} # ❌ incorrect data
{Width=2048, Height=864} # ❌ incorrect data
{Width=2048, Height=864} # ❌ incorrect data
True
{X=788,Y=391} # ✔️ data became correct
{Width=2048, Height=864} # ❌ still incorrect data
{Width=2560, Height=1080} # ✔️ data became correct
与 c# 代码相同的情况:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
public class Class1
{
[DllImport("user32.dll")]
static extern bool SetProcessDPIAware();
public static void Main()
{
Console.WriteLine("\n");
Console.WriteLine(Cursor.Position);
Console.WriteLine(Screen.PrimaryScreen.Bounds.Size);
Console.WriteLine(SystemInformation.PrimaryMonitorSize);
Console.WriteLine(SetProcessDPIAware());
Console.WriteLine(Cursor.Position);
Console.WriteLine(Screen.PrimaryScreen.Bounds.Size);
Console.WriteLine(SystemInformation.PrimaryMonitorSize);
}
}
那么这是Screen.PrimaryScreen.Bounds
的错误还是我必须做其他事情才能从此属性中获取正确的数据?
如果唯一的方法是使用SystemInformation
类,那么我如何获取有关第二台监视器的数据,而不仅仅是有关主要监视器的数据?
或者有没有办法为 powershell.exe / powershell_ise.exe 设置此设置?
这是我使用并为我工作的内容:
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
using System.Drawing;
public class DPI
{
[DllImport("gdi32.dll")]
static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
public enum DeviceCap
{
VERTRES = 10,
DESKTOPVERTRES = 117
}
public static float scaling()
{
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
}
}
'@ -ReferencedAssemblies System.Drawing -IgnoreWarnings -WarningAction Ignore
然后你可以调用这个类并获得 DPI,如:
$DPI = [math]::round([dpi]::scaling(), 2) * 100
$bounds = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea
$bounds.Width = ($bounds.Width / 100) * $DPI
$bounds.Height = ($bounds.Height / 100) * $DPI
最后,始终使用相对大小,例如:
$form.Size = [System.Drawing.Size]::new(($bounds.Width / X),($bounds.Height / X))
$form.Add_Resize({
$txtBox.Size = [System.Drawing.Size]::new(($this.Width - X), XX)
})
依此类推,其中X
可以是int
或double
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.