【问题标题】:XLib Window Name ProblemsXLib 窗口名称问题
【发布时间】: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 函数获取窗口名称?

标签: c++ c xlib xorg


【解决方案1】:

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

【讨论】:

  • 谢谢,我刚把XA_STRING改成AnyPropertyType,让printf像以前一样,效果很好,我也看了xprop源代码,发现有点复杂。
  • 如果标题中有非 ASCII 字符可能会失败。
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2013-03-21
  • 2011-11-06
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
相关资源
最近更新 更多