6053377 发表于 2022-9-13 10:57:30

win10缩放125%,150%导致获取坐标不准确。

win10缩放125%,150%导致获取坐标不准确。100%写好了脚本,系统缩放不是100%了,坐标位置就变动了。如果获取125%,150%的系统状态,多做几遍适配也行。但是找了好久好像没有很好的解决办法

jiarqq 发表于 2022-9-13 18:34:22

Func get_Desktop_Scale()
        $hDC = _WinAPI_GetDC(0)
        $Scale = _WinAPI_GetDeviceCaps($hDC, 118) / @DesktopWidth
        _WinAPI_ReleaseDC($hGUI, $hDC)
        Return $Scale
EndFunc   ;==>get_Desktop_Scale


;1.获取显示的缩放比例
;2.坐标乘以scale(缩放比率)

afan 发表于 2022-9-13 18:20:59

获取DPI值 /96得到缩放比例,坐标*比例

6053377 发表于 2022-9-14 09:14:40

afan 发表于 2022-9-13 18:20
获取DPI值 /96得到缩放比例,坐标*比例

试了几个函数,但是都不行,console输出的比例都相同,无论是125% or 150%

h111666b 发表于 2022-9-14 12:12:00

使用1楼的代码得到了正确的缩放倍率,现在有个问题,是不是每行代码的   左侧,顶部, 宽度,高度   这4项都要分别乘倍率,示例如下

Func get_Desktop_Scale()
        Local $hDC, $Scale, $hGUI
        $hDC = _WinAPI_GetDC(0)
        $Scale = _WinAPI_GetDeviceCaps($hDC, 118) / @DesktopWidth
        _WinAPI_ReleaseDC($hGUI, $hDC)
        Return $Scale
EndFunc   ;==>get_Desktop_Scale
Local $HiDpi = get_Desktop_Scale()

;GUI窗口和按钮
$GUI = GUICreate("测试", $HiDpi * 322, $HiDpi * 200)
;标签
GUICtrlCreateLabel("系统DPI自适应测试", $HiDpi * 87, $HiDpi * 61, $HiDpi * 230, $HiDpi * 15)

GUISetState(@SW_SHOW)


有没有简单点的代码,不必要每行代码都要乘倍率就能自动全局自适应

afan 发表于 2022-9-14 13:09:55

h111666b 发表于 2022-9-14 12:12
使用1楼的代码得到了正确的缩放倍率,现在有个问题,是不是每行代码的   左侧,顶部, 宽度,高度   这4项都 ...

在 100% 缩放状态下编写好GUI代码
前面添加 Opt("GUIResizeMode", 1)
获取 DPI 缩放比例
根据比例 WinMove() 缩放窗口大小即可,内部控件均会等比例放大。若有特殊限位再调整控件坐标

h111666b 发表于 2022-9-14 13:46:44

刚刚试了下,不会弄,DPI缩放比例是1.25,就是不起效,老大帮忙下

;缩放比例
$DPI = 1.25
;GUI窗口和按钮
$GUI = GUICreate("测试", $HiDpi * 322, $HiDpi * 200)

;这一行不会弄,DPI缩放是1.25
WinMove($GUI, "", Default * $DPI, Default * $DPI, $Width * $DPI, $Height * $DPI)

;标签
GUICtrlCreateLabel("系统DPI自适应测试", $HiDpi * 87, $HiDpi * 61, $HiDpi * 230, $HiDpi * 15)

GUISetState(@SW_SHOW)

afan 发表于 2022-9-14 14:04:43

本帖最后由 afan 于 2022-9-14 14:16 编辑

h111666b 发表于 2022-9-14 13:46
刚刚试了下,不会弄,DPI缩放比例是1.25,就是不起效,老大帮忙下

;缩放比例

DllCall('User32.dll', 'BOOL', 'SetProcessDPIAware')

Opt("GUIResizeMode", 1)

;GUI窗口和按钮
$GUI = GUICreate("测试", 322, 200)
;标签
GUICtrlCreateLabel("系统DPI自适应测试", 87, 61, 230, 15)
;缩放比例
$DPI = 1.25
WinMove($GUI, "", Default, Default, 322 * $DPI, 200 * $DPI)
GUISetState(@SW_SHOW)
Sleep(2000)

h111666b 发表于 2022-9-14 15:10:58

已经完美自动适应,感谢老大,还有个小问题,WinMove执行后GUI窗口在屏幕上居中不了,有点偏右,不能自动居中

h111666b 发表于 2022-9-14 15:16:48

居中问题已经解决,善用搜索能解决很多问题,论坛窗口居中贴https://www.autoitx.com/forum.php?mod=viewthread&tid=29109&highlight=%BE%D3%D6%D0

6053377 发表于 2022-9-14 22:15:34

afan 发表于 2022-9-14 13:09
在 100% 缩放状态下编写好GUI代码
前面添加 Opt("GUIResizeMode", 1)
获取 DPI 缩放比例


厉害了,我也成功了。用au3写的窗口没问题。但是想适配第三方的程序不会弄


afan 发表于 2022-9-14 23:09:58

6053377 发表于 2022-9-14 22:15
厉害了,我也成功了。用au3写的窗口没问题。但是想适配第三方的程序不会弄

如果是标准控件,可以试试
#Include <GuiListView.au3>
_GUICtrlListView_SetColumnWidth(获取的listview句柄, 3, 宽度值)

6053377 发表于 2022-9-15 08:59:23

afan 发表于 2022-9-14 23:09
如果是标准控件,可以试试
#Include
_GUICtrlListView_SetColumnWidth(获取的listview句柄, 3, 宽度值 ...

谢谢老大

字数补丁
页: [1]
查看完整版本: win10缩放125%,150%导致获取坐标不准确。