为何xdotool获取的窗口位置加几何尺寸总和与显示器总大小不符
窗口Y轴坐标与高度之和超出显示器高度的原因
- X11窗口系统本身支持窗口边界超出显示器可视范围,即便是最大化状态的窗口,部分窗口管理器也会将窗口的底部边框、阴影效果,或是预留的隐形边距延伸到屏幕外,这部分不可见的区域依然会被计入窗口的几何参数统计。
xdotool getwindowgeometry返回的窗口尺寸是完整的边界框尺寸,包含窗口管理器额外添加的标题栏、边框、阴影、隐形边距等所有装饰元素,不会自动过滤屏幕外的不可见部分。
你给出的测试数据中81 + 1027 = 1108,比显示器高度1080多出的28像素,就是窗口延伸到屏幕下方的不可见区域尺寸。
适配截图裁剪需求的解决方法
你可以对拿到的窗口参数做范围钳位,过滤超出屏幕的不可见部分,计算逻辑如下:
- 先获取基础参数:
- 窗口左上角X坐标:
win_x - 窗口左上角Y坐标:
win_y - 窗口总宽度:
win_w - 窗口总高度:
win_h - 显示器宽度:
disp_w - 显示器高度:
disp_h
- 窗口左上角X坐标:
- 计算实际可见区域的参数:
# 可见区域左上角坐标不能小于屏幕左上角的0,0 clip_x = max(win_x, 0) clip_y = max(win_y, 0) # 可见区域宽高不能超出屏幕剩余可显示范围 clip_w = min(win_w, disp_w - clip_x) clip_h = min(win_h, disp_h - clip_y)
使用计算得到的clip_x、clip_y、clip_w、clip_h参数裁剪截图,即可得到与实际可见窗口完全匹配的尺寸。
补充说明
如果是多显示器环境,xdotool getdisplaygeometry返回的是所有显示器拼接后的总分辨率,你需要额外获取窗口所在的单个显示器的坐标范围,再进行钳位计算,否则也会出现尺寸不匹配的问题。
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

