XLib窗口名称问题

4

在过去的4天里,我一直在尝试了解XLib的工作原理,现在我终于明白了。因此,我尝试编写一个简短的程序来获取打开窗口的名称。为此,我创建了两个函数:

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-Laptop:〜

6:

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

请您帮忙吗?


你尝试过使用XFetchName函数获取窗口名称吗? - Frank Hale
1个回答

3

WM_NAME 并不一定是一个简单的字符串。它可能是一个复合文本(另一种类型的字符串),这正是 Skype 窗口的情况。您需要使用 AnyPropertyType 而不是 XA_STRING 来获取属性,然后根据实际类型进行格式化。查看 xprops 的源代码以了解如何执行此操作。


1
谢谢,我刚刚将XA_STRING更改为AnyPropertyType,并像以前一样使用printf,它运行得非常好。我还查看了xprop源代码,但发现它有点复杂。 - ex0ns
如果标题中有非 ASCII 字符,可能会失败。 - n. m.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接