我正在尝试编写一个程序,用于跟踪何时使用Xlib更改活动窗口。我很难找出最好的方法来做到这一点。这些是我的想法到目前为止:xlib是否有活动窗口事件?
- 每秒钟使用_NET_ACTIVE_WINDOW来获取活动窗口,如果它已经改变,然后运行事件的相关代码。
- 获取所有窗口的列表,并听取他们的重点事件。我将不得不弄清楚如何保持最新的打开窗口列表。
他们是更容易/更好的方法吗?我是使用Xlib进行编程的新手。
我正在尝试编写一个程序,用于跟踪何时使用Xlib更改活动窗口。我很难找出最好的方法来做到这一点。这些是我的想法到目前为止:xlib是否有活动窗口事件?
他们是更容易/更好的方法吗?我是使用Xlib进行编程的新手。
你就不能选择根窗口PropertyChange
以获取发送PropertyNotify
事件时,任何财产进行更新,然后检查每个事件,看它是否是为?
以下是@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
我写的一个比较完整的评论版本作为人的例子是this gist。
倾听所有焦点事件并为所有窗口注册所有处理程序似乎非常昂贵。我想知道,事实上,是否通常监听PointerMove,然后从事件处理函数中调用'XGetInputFocus()'来找出被移动的人在移动时的开销会小一些。这是怎么实时的?如果答案是“秒很好”,那么轮询方法似乎是最好的。 – 2011-03-10 17:12:43
它不一定是实时的,在几秒钟内就没问题。我会尝试第一种方法。谢谢FrankH。 – Jim 2011-03-11 03:26:58