winforms 当应用程序不支持DPI时,使用VB.Net检测监视器比例

wz3gfoph  于 2023-02-09  发布在  .NET
关注(0)|答案(1)|浏览(176)

通过使用ScreenScreen.AllScreens用于多屏幕)类,可以很容易地获得屏幕的基本信息。但是,在多显示器设置中,似乎很难获得每个屏幕的DPI或显示器比例信息
我在How to get Windows Display settings?中找到了一些针对"DPI感知"应用的解决方案
然而,如上所述,它们大多要求运行的应用程序为"DPI感知"或单屏幕环境(任何FormControl必须位于所需的屏幕中以计算DPI值)。
我只想得到每台显示器的"比例值(100%,125% ..在显示设置〉比例和布局)"(它可以不DPI)。重要的是,该应用程序没有声明为"DPI感知",它不会。它是一个WinForm遗留程序。
在那种情况下有可能做到吗?
先谢谢你。

xriantvc

xriantvc1#

Public Declare Function DwmGetWindowAttribute Lib "dwmapi" (ByVal hwnd As IntPtr, ByVal dwAttribute As Integer, ByRef pvAttribute As RECT, ByVal cbAttribute As Integer) As Integer
Const DWMWA_EXTENDED_FRAME_BOUNDS As Integer = 9

<System.Runtime.InteropServices.DllImport("user32.dll")>
Public Function GetWindowRect(ByVal hWnd As IntPtr, ByRef lpRect As RECT) As Boolean : End Function    

Public Structure RECT
    Public left, top, right, bottom As Integer
End Structure

Public Function GetScalingPercent() As Integer
    Dim rcFrame As RECT
    DwmGetWindowAttribute(Me.Handle, DWMWA_EXTENDED_FRAME_BOUNDS, rcFrame, System.Runtime.InteropServices.Marshal.SizeOf(rcFrame))
    Dim rcWind As RECT
    GetWindowRect(Me.Handle, rcWind)
    Return Int((rcFrame.right - rcFrame.left) / (rcWind.right - rcWind.left) * 100 / 25) * 25
End Function

注意:对于DWMWA_EXTENDED_FRAME_BOUNDS以外的用途,或者对于pvAttribute使用RECT以外的内容的任何情况,此代码段中DwmGetWindowAttribute的签名都是不正确的。
你的窗口也必须显示在你想要获取缩放比例的屏幕上。所以不要在窗体中使用这个。加载事件

相关问题