XLib窗口名称问题

从4天开始,我试着看看XLib是如何工作的,我终于明白了。 我尝试制作一个能找回开窗名称的短程序。 为此,我创建了2个函数:

Window *list (Display *disp, unsigned long *len) { Atom prop = XInternAtom(disp,"_NET_CLIENT_LIST",False), type; int form; unsigned long remain; unsigned char *list; if (XGetWindowProperty(disp,XDefaultRootWindow(disp),prop,0,1024,False,XA_WINDOW, &type,&form,len,&remain,&list) != Success) { return 0; } return (Window*)list; } 

因此,第一个函数返回所有窗口的窗口对象。 然后,我创建了一个函数来从所有窗口中检索名称。

 char *name (Display *disp, Window win) { Atom prop = XInternAtom(disp,"WM_NAME",False), type; int form; unsigned long remain, len; unsigned char *list; if (XGetWindowProperty(disp,win,prop,0,1024,False,XA_STRING, &type,&form,&len,&remain,&list) != Success) { return NULL; } return (char*)list; } 

这个函数运行正常,一个main.c示例:

 int main(int argc, char* argv[]){ int i; unsigned long len; XKeyEvent esend; Display *disp = XOpenDisplay(NULL); Window *list; char *name; list = (Window*)list(disp,&len); for (i=0;i<(int)len;i++) { name = name(disp,list[i]); printf("%d : %s \n",i,name); free(name); } } 

并且,它工作得非常好,除了它返回的Skype窗口:

1:Xlib编程手册:键盘和指针事件 – 谷歌浏览器

2:Debian Web [En fonction] – Oracle VM VirtualBox

3:XChat:necromoine @ /(+ CSTfnst 10:2)

4:

5:root @ root-Laptop:〜

6:

并且,数字4和6是空白的(实际上我有两个打开的Skype窗口)。

你能帮我吗。

WM_NAME不一定是简单的字符串。 它可以是复合文本(不同类型的字符串),实际上是Skype窗口的情况。 您需要使用AnyPropertyType而不是XA_STRING来获取属性,然后根据实际类型进行格式化。 查看xprops的来源,看看它是如何完成的。