您可以嘗試使用XGetWMName
函數。儘管XGetWMName
和XFetchName
的描述都表示他們會返回WM_NAME
屬性,但它們似乎彼此不同。有時候,他們會返回相同的名字。有時候,只有XGetWMName
返回名稱。
您也可以使用xwininfo -root -tree
來獲取所有窗口的名稱,並與XFetchName
和XGetWMName
的結果進行比較。
此代碼可以列出所有窗口並打印窗口ID和XFetchName
和XGetWMName
的結果。您可以使用窗口ID在xwininfo -root -tree
的輸出中查找。
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
void enum_windows(Display* display, Window window, int depth) {
int i;
XTextProperty text;
XGetWMName(display, window, &text);
char* name;
XFetchName(display, window, &name);
for (i = 0; i < depth; i++)
printf("\t");
printf("id=0x%x, XFetchName=\"%s\", XGetWMName=\"%s\"\n", window, name != NULL ? name : "(no name)", text.value);
Window root, parent;
Window* children;
int n;
XQueryTree(display, window, &root, &parent, &children, &n);
if (children != NULL) {
for (i = 0; i < n; i++) {
enum_windows(display, children[i], depth + 1);
}
XFree(children);
}
}
int main() {
Display* display = XOpenDisplay(NULL);
Window root = XDefaultRootWindow(display);
enum_windows(display, root, 0);
}
這裏的一個片輸出的表示兩個函數的結果可以是不同的。
id=0x2c7, XFetchName="(no name)", XGetWMName="(null)"
id=0x400001, XFetchName="(no name)", XGetWMName="(null)"
id=0x800036, XFetchName="(no name)", XGetWMName="(null)"
id=0x1400001, XFetchName="(no name)", XGetWMName="c - XFetchName always returns 0 - Stack Overflow - Chromium"
id=0x1000001, XFetchName="terminator", XGetWMName="terminator"
id=0x1000002, XFetchName="(no name)", XGetWMName="(null)"
id=0x1200001, XFetchName="chromium", XGetWMName="chromium"
id=0x1200002, XFetchName="(no name)", XGetWMName="(null)"
這裏的一個片的xwininfo -root -tree
輸出表示這些窗口的名稱。 xwininfo:窗口ID:0x2c7(根窗口)(沒有名字)
Root window id: 0x2c7 (the root window) (has no name)
Parent window id: 0x0 (none)
29 children:
0x1200001 "chromium": ("chromium" "Chromium") 10x10+10+10 +10+10
1 child:
0x1200002 (has no name):() 1x1+-1+-1 +9+9
0x1000001 "terminator": ("terminator" "Terminator") 10x10+10+10 +10+10
1 child:
0x1000002 (has no name):() 1x1+-1+-1 +9+9
0x800036 (has no name):() 1364x741+0+25 +0+25
1 child:
0x1400001 "c - XFetchName always returns 0 - Stack Overflow - Chromium": ("Chromium" "Chromium") 1364x741+0+0 +1+26
0x400001 (has no name):() 10x10+-20+-20 +-20+-20
爲什麼'_'在'_main '? – 2012-01-11 19:55:29
從Xterm運行(默認情況下名稱爲「xterm」設置),您的代碼在我正在使用的計算機(OSX Lion)上運行得非常好。另外,我添加了一個對'XStoreName()'的調用,將其設置爲其他第一個,並且按照預期工作,並且您的代碼檢索新名稱就好了。這當然是在將_main()重命名爲main()之後的 - 你如何運行你的程序? – 2012-01-11 20:07:37
'_'只是用命令行「-Wl,-e__main」來定義入口點名稱,因爲我沒有使用stdlib,我不認爲這必須做任何事情。並仍然從Ubuntu的終端執行時返回0,但從xterm工作,是否有這個原因? – killercode 2012-01-12 01:44:52