C、Xlib、can和x27;无法获取聚焦窗口的名称

C、Xlib、can和x27;无法获取聚焦窗口的名称,c,linux,x11,xlib,xserver,C,Linux,X11,Xlib,Xserver,这是我正在使用的代码 #include <stdio.h> #include <X11/Xlib.h> Display *dpy; char *window_name_return = NULL; Window focused; int revert_to; void main(){ dpy = XOpenDisplay(NULL) ; if(!dpy) printf("error\n

这是我正在使用的代码

#include <stdio.h>
#include <X11/Xlib.h>

      Display *dpy;
      char *window_name_return = NULL;
      Window focused;
      int revert_to;

void main(){
    
    dpy = XOpenDisplay(NULL) ;
    if(!dpy) printf("error\n");
        
    XGetInputFocus(dpy, &focused, &revert_to);
    XFetchName(dpy, focused, &window_name_return);
    XFree(window_name_return);
    printf("Focus on %s\n", window_name_return);
    XCloseDisplay(dpy);
}
#包括
#包括
显示*dpy;
char*window\u name\u return=NULL;
窗口聚焦;
int返回到;
void main(){
dpy=XOpenDisplay(空);
如果(!dpy)printf(“错误\n”);
XGetInputFocus(dpy、聚焦和还原);
XFetchName(dpy、聚焦和窗口名称返回);
XFree(窗口名称返回);
printf(“关注%s\n”,窗口名称\u返回);
XCloseDisplay(dpy);
}
这只适用于终端仿真器窗口,对于其他窗口,程序返回null。
XFetchName
的文档中说

如果尚未为此窗口设置WM_NAME属性,则XFetchName() 将窗口名称设置为NULL

这就是它不起作用的原因吗?我使用dwm窗口管理器,在Openbox中运行代码也不起作用


如何更改代码以使其适用于所有类型的窗口?

您的代码中存在多个问题:

  • 首先,您不检查由
    XFetchName
    返回的状态
  • 第二个不检查
    window\u name\u return
    是否为空
  • 第三个也是最糟糕的问题是在打印字符串之前释放字符串(使指针无效)

感谢您提供的信息,我昨天才尝试学习Xlib,而且我使用C已经很长时间了。