资讯详情

资讯详情

AutoHotkey 窗口定位的实用方法:从屏幕坐标到控件点击

AutoHotkey 窗口定位的实用方法从屏幕坐标到控件点击【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkeyAutoHotkey 窗口定位是 GUI 自动化脚本里最常见的坑同一套脚本在 1080p 主屏上点得准换到 2K 副屏之后全部点空窗口挪动一点也一样。原因不在点击命令本身而在脚本使用的坐标——写死的是一组屏幕像素而不是哪个窗口里的哪个控件。三层坐标系的关系写代码之前先弄清三层坐标。Click 只认屏幕坐标(0,0) 是虚拟屏幕的左上角也就是主显示器左上角MouseGetPos 取到的参数坐标也属于这一层。WinGetPos 返回第二层窗口左上角在屏幕上的位置。ControlGetPos 返回最内层控件在窗口内部的偏移。坐标层来源命令参照点屏幕坐标Click的参数虚拟屏幕(0,0) 为主屏左上角窗口坐标WinGetPos窗口左上角的屏幕位置控件坐标ControlGetPos控件在窗口内部的偏移三层之间是叠加关系不是替换关系控件在屏幕上的绝对位置 窗口屏幕坐标 控件窗口内偏移。换句话说点击一个控件要完成两次查找——先查窗口在屏幕上的门牌号再查控件在窗口里的相对地址两者相加才是点击点。任何一层用固定数值代替分辨率或窗口位置一变整条链路就失效。完整定位链路从找到窗口到点击控件链路按执行顺序分四步定位窗口、定位控件、换算绝对坐标、执行动作。定位窗口。记事本开了多个实例时只靠标题匹配会含糊先拿到窗口句柄后续查询都用 ahk_id 指定目标。; 获取窗口句柄避免多实例时标题歧义 WinGet, targetID, ID, 无标题 - 记事本 ; 查询该窗口在屏幕上的位置和尺寸 WinGetPos, winX, winY, winWidth, winHeight, ahk_id %targetID%定位控件。ControlGetPos 返回的坐标相对于窗口本身窗口怎么移动都不受影响。; 查询按钮在窗口内的偏移和尺寸 ControlGetPos, btnX, btnY, btnWidth, btnHeight, Button1, ahk_id %targetID%换算绝对坐标并执行动作。两层坐标相加按钮中心即偏移量加上一半尺寸。; 窗口位置 控件偏移 屏幕绝对坐标 clickX : winX btnX (btnWidth // 2) clickY : winY btnY (btnHeight // 2) Click, %clickX%, %clickY%注意这些坐标是执行时查询出来的结果窗口一旦移动旧值就过期了。重复点击前重新跑一遍查询即可把整条链路包进一个函数、每次动作前调用是最稳妥的做法。点不中时的排查顺序点击落空时按下面顺序过一遍每一项对应一种常见的固定偏移来源。DPI 缩放不是 100%系统缩放 125%、150% 时肉眼量出的坐标和系统返回的坐标存在固定比例差点击总是差一截。检查脚本的 DPI 感知设置或先用 WinGetPos 验证实际返回值。多显示器负坐标主屏放在右边时左侧显示器的 x 为负值把负坐标强行取正会算错点。保留坐标符号以整个虚拟屏幕为参照计算。窗口标题含动态内容无标题 - 记事本保存一次文件就变成test.txt - 记事本精确匹配直接落空。改用通配符或 ahk_class 匹配或先 WinWait 确认窗口存在。控件被遮挡目标控件被弹出层或菜单盖住点击落到了遮挡层上。先 WinActivate 激活窗口再用 ControlGetPos 确认控件可见。固定偏移返回的控件坐标相对于窗口窗口带标题栏和边框时与目测的内容区位置存在固定差值。以命令实测输出为准不要用目测值。整条链路的核心就一句话运行时依次查询窗口位置和控件偏移用它们的和推导出点击点任何一层都不落固定数值。下一步可以先在自己真实屏幕上打开目标窗口单独跑一遍 WinGetPos核对四个返回值——确认输出与屏幕所见一致后再接上后面的链路。【免费下载链接】AutoHotkeyAutoHotkey - macro-creation and automation-oriented scripting utility for Windows.项目地址: https://gitcode.com/gh_mirrors/au/AutoHotkey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →