【发布时间】:2012-02-20 16:32:30
【问题描述】:
4天以来,我尝试看看XLib是如何工作的,我终于明白了。 Si 我试图制作一个简短的程序来检索打开的窗口的名称。 为此,我创建了 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 编程手册:键盘和指针事件 - Google Chrome
2 : Debian Web [En fonction] - Oracle VM VirtualBox
3 : XChat: necromoine @ / (+CSTfnst 10:2)
4:
5:root@root-笔记本电脑:~
6:
而且,数字 4 和 6 是空白的(我实际上有两个打开的 Skype 窗口)。
你能帮帮我吗?
【问题讨论】:
-
您是否尝试过使用 XFetchName 函数获取窗口名称?