4

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

助けてください。

4

1 に答える 1

3

AWM_NAMEは必ずしも単純な文字列ではありません。これは複合テキスト (異なるタイプの文字列) である可能性があり、これは実際には Skype ウィンドウの場合です。AnyPropertyTypeプロパティを取得する代わりに使用する必要がありXA_STRING、実際のタイプに従ってフォーマットします。のソースをxprops見て、それがどのように行われているかを確認してください。

于 2012-02-20T20:49:51.720 に答える