You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XGetWindowAttributes始终返回初始窗口位置的原因咨询

XGetWindowAttributes返回初始窗口位置的原因及解决方法
  • 核心原因:XGetWindowAttributes返回的x和y是窗口客户端区域(不含边框)相对于其父窗口的位置,而非窗口在屏幕上的绝对坐标。当你通过窗口管理器拖动顶层窗口时,窗口管理器实际调整的是包含边框的整个窗口框架的位置,而客户端区域相对于框架的偏移是固定的,因此这个函数返回的坐标不会随窗口移动而改变。

  • 解决方法:

    1. 使用XTranslateCoordinates将窗口的原点(0,0)转换为根窗口的坐标,以此获取窗口在屏幕上的绝对位置:
      Window root_return;
      int root_x, root_y;
      int win_x, win_y;
      unsigned int mask_return;
      XTranslateCoordinates(display, your_window, RootWindow(display, screen),
                           0, 0, &root_x, &root_y, &root_return, &mask_return);
      // root_x和root_y就是窗口原点在屏幕上的绝对坐标
      
    2. 若要获取包含边框的整个窗口的位置和大小,可以查询窗口管理器的_NET_WM_GEOMETRY属性:
      Atom net_wm_geometry = XInternAtom(display, "_NET_WM_GEOMETRY", False);
      long geom_data[4];
      Atom actual_type;
      int actual_format;
      unsigned long nitems, bytes_after;
      if (XGetWindowProperty(display, your_window, net_wm_geometry, 0, 4, False,
                             AnyPropertyType, &actual_type, &actual_format,
                             &nitems, &bytes_after, (unsigned char**)&geom_data) == Success) {
          int x = geom_data[0];
          int y = geom_data[1];
          unsigned int width = geom_data[2];
          unsigned int height = geom_data[3];
          // x,y是整个窗口(含边框)的屏幕坐标,width,height是整体尺寸
      }
      

内容的提问来源于stack exchange,提问作者Irbis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:58:17