首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XLib窗口名称问题

XLib窗口名称问题
EN

Stack Overflow用户
提问于 2012-02-21 00:32:30
回答 1查看 3K关注 0票数 4

4天来,我试着看看XLib是如何工作的,我终于明白了。我试着做一个简短的程序来检索打开的窗口的名字。为此,我创建了两个函数:

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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示例:

代码语言:javascript
复制
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功能- Oracle VM VirtualBox

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

4:

5: root@root-Laptop:~

6:

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

你能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-21 04:49:52

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9364668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档