【发布时间】:2014-10-10 12:45:39
【问题描述】:
我想在 C 中使用 Xlib 获取所有打开的窗口标题的列表。我正在运行 Ubuntu 12.04。我正在使用以下代码来完成此操作:
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <stdio.h>
#include <stdlib.h>
Window *list(Display *disp, unsigned long *len)
{
Atom prop = XInternAtom(disp, "_NET_CLIENT_LIST", False), type;
int form;
unsigned long remain;
unsigned char *list;
XGetWindowProperty(disp, XDefaultRootWindow(disp), prop, 0, 1024, False, XA_WINDOW,
&type, &form, &len, &remain, &list);
return (Window *)list;
}
char *name(Display *disp, Window window)
{
Atom prop = XInternAtom(disp, "WM_NAME", False), type;
int form;
unsigned long remain, len;
unsigned char *list;
XGetWindowProperty(disp, window, prop, 0, 1024, False, AnyPropertyType,
&type, &form, &len, &remain, &list);
return (char*)list;
}
int main(int argc, char *argv[])
{
Display *disp;
Window *wlist;
unsigned long len;
char *wname;
disp = XOpenDisplay(NULL);
wlist = (Window*)list(disp, &len);
int i;
for(i = 0; i < (int)len; i++){
if(wlist[i] != 0){
wname = name(disp, wlist[i]);
printf("%d: %s\n", i, wname);
free(wname);
}
}
return 0;
}
现在我遇到的问题是,这会通过大多数窗口,然后给我一个 BadWindow 错误:
0: DNDCollectionWindow
1: launcher
2: Desktop
3: panel
4: Dash
5: Hud
6: Switcher
7: Update Manager
8: Terminal
9: Ask a Question - Stack Overflow - Mozilla Firefox
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 20 (X_GetProperty)
Resource id in failed request: 0x41
Serial number of failed request: 22
Current serial number in output stream: 22
所以我想知道是否有人知道是什么导致了这个/如何解决它?
据我所知,列表函数正在返回一些我无法检索其名称的窗口,但我不确定。
提前致谢!
【问题讨论】:
-
使用此处列出的代码,第 14 行产生编译器警告“预期为 'long unsigned int *' 但参数类型为 'long unsigned int **'”,然后是 main 中的 len(行后38) 为 0,循环未运行。我将参数 (#10) 从
&len更改为len(因为它已经作为指针传递给 list() ),它编译时没有警告,并产生了所需的输出而没有错误。 -
在另一个测试中,我在循环之前插入了一个
sleep(),让我有时间关闭一个打开的窗口,并且错误已经重现。