0

我编写了以下代码来检测另一个应用程序(不是我的代码)在屏幕上创建窗口的时间:

Display* display = XOpenDisplay(":0");
XSetWindowAttributes attributes;
attributes.event_mask = SubstructureNotifyMask | StructureNotifyMask;
Window win = XDefaultRootWindow(display);
XChangeWindowAttributes(display, win, CWEventMask, &attributes);

while (1) {
   XEvent event;
   XNextEvent(display, &event);
   if (event.type == CreateNotify)
      puts("create Notify event occured\n");
}

该代码基本上可以工作,但是,我注意到,当我启动一个应用程序(例如终端)时,该CreateNotify事件似乎被触发了多次。谁能解释为什么?我原以为每个启动的应用程序/窗口CreateNotify只会触发一次。我如何修改代码来实现这一点?

4

1 回答 1

0

这些事件是针对子窗口的。根据Xlib 编程手册,“创建任何孩子......都会生成一个事件。” 一个典型的 X 应用程序包括许多子窗口,您可以看到每个子窗口。

当您收到事件时,请检查event.xcreatewindow.parentXEvent是每个参考的联合)。如果是win根窗口,则您有一个顶级窗口。否则,您有一个子窗口。尝试:

if ( (event.type == CreateNotify) && (event.xcreatewindow.parent == win) )
    puts("top-level create Notify event occured\n");
于 2016-10-26T18:52:14.513 回答