2012-02-20 147 views
3

自4天以來,我嘗試瞭解XLib如何工作,並且我終於明白了這一點。 Si我試圖製作一個簡短的程序來檢索打開的窗口的名稱。 對於這一點,我創建了2個功能: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 [安裝] - Oracle VM VirtualBox

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

4:

5:根@根筆記本:〜

6:

並且,號碼4和6是空白的(我實際上有兩個打開的Skype窗口)。

你能幫我嗎。

+0

您是否嘗試過使用XFetchName函數來獲取窗口名稱? – 2012-02-20 17:01:10

+0

是的,它返回(null)。 – ex0ns 2012-02-20 18:48:05

回答

3

A WM_NAME不一定是簡單的字符串。它可能是一個複合文本(不同類型的字符串),實際上Skype窗口就是這種情況。您需要使用AnyPropertyType而不是XA_STRING來獲取該屬性,然後根據實際類型進行格式化。看看xprops的來源,看看它是如何完成的。

+1

謝謝,我只是把XA_STRING改成了AnyPropertyType,讓printf像之前一樣,它工作得很好,我也看了xprop的源代碼,但是我發現它有點複雜。 – ex0ns 2012-02-22 18:12:33

+0

如果標題中包含非ASCII字符,則可能會失敗。 – 2014-12-31 09:50:41