2012-02-20 8 views
3

4日後、XLibの動作を確認しようとしました。 私は開いたウィンドウの名前を取得する短いプログラムを作ろうとしました。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; 
} 

ので、この最初の関数は、すべてのウィンドウのwindowオブジェクトを返します。そのために は、私は2つの機能を作成しました。 次に、これらのすべてのウィンドウから名前を取得する関数を作成しました。

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は空白です(実際には2つのSkypeウィンドウが開いています)。

お願いします。

+0

XFetchName関数を使用してウィンドウ名を取得しようとしましたか? –

+0

はい(null)を返します。 – ex0ns

答えて

3

WM_NAMEは必ずしも単純な文字列である必要はありません。複合テキスト(別の種類の文字列)でもかまいませんが、これは実際にはSkypeウィンドウの場合です。プロパティを取得するにはXA_STRINGの代わりにAnyPropertyTypeを使用し、実際のタイプに応じてフォーマットする必要があります。それがどのように行われたかを見るには、xpropsの出典を見てください。

+1

ありがとう、XA_STRINGをAnyPropertyTypeに変更してprintfを以前のように変更したところ、本当にうまく動作しました。xpropソースコードも調べましたが、少し複雑でした。 – ex0ns

+0

タイトルにASCII以外の文字が含まれていると、失敗することがあります。 –

関連する問題