gpt4 book ai didi

c++ - XLib 窗口名称问题

转载 作者:太空狗 更新时间:2023-10-29 21:27:18 24 4
gpt4 key购买 nike

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 [功能] - Oracle VM VirtualBox

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

4:

5 : root@root-笔记本电脑: ~

6:

而且,数字 4 和 6 是空白的(我实际上有两个打开的 skype 窗口)。

你能帮帮我吗

最佳答案

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

关于c++ - XLib 窗口名称问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9364668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com