xlib是否有一个活动的窗口事件?

我正在尝试编写一个程序来跟踪活动窗口使用Xlib时的变化。 我很难找出最好的方法来做到这一点。 这些是我的想法到目前为止:

  • 每秒钟使用_NET_ACTIVE_WINDOW来获取活动窗口,如果它已经改变,然后运行事件的相关代码。
  • 获取所有窗口的列表,并听取他们的重点事件。 我将不得不弄清楚如何保持最新的打开窗口列表。

他们是一个更简单/更好的方法? 我是用Xlib编程的新手。

Solutions Collecting From Web of "xlib是否有一个活动的窗口事件?"

你不能只是在根窗口上选择PropertyChange来更新任何属性时发送的PropertyNotify事件,然后检查每个事件是否为_NET_ACTIVE_WINDOW

我一直在寻找“活动窗口更改事件捕获器”以及。 我使用的平均时间(可能对你有帮助)是xdotool和xwininfo的结合。

 xwininfo -id "$(xdotool getactivewindow)" 

这是@alanc提出​​的一个Python实现。

 import Xlib import Xlib.display disp = Xlib.display.Display() root = disp.screen().root NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW') NET_WM_NAME = disp.intern_atom('_NET_WM_NAME') last_seen = {'xid': None} def get_active_window(): window_id = root.get_full_property(NET_ACTIVE_WINDOW, Xlib.X.AnyPropertyType).value[0] focus_changed = (window_id != last_seen['xid']) last_seen['xid'] = window_id return window_id, focus_changed def get_window_name(window_id): try: window_obj = disp.create_resource_object('window', window_id) window_name = window_obj.get_full_property(NET_WM_NAME, 0).value except Xlib.error.XError: window_name = None return window_name if __name__ == '__main__': root.change_attributes(event_mask=Xlib.X.PropertyChangeMask) while True: win, changed = get_active_window() if changed: print(get_window_name(win)) while True: event = disp.next_event() if (event.type == Xlib.X.PropertyNotify and event.atom == NET_ACTIVE_WINDOW): break 

在这个要点中,我作为一个例子写了一个更完整的评论版本。