gpt4 book ai didi

python - 使用 python xlib 发生更改焦点事件时如何检测应用程序名称 “correctly”

转载 作者:太空狗 更新时间:2023-10-30 02:45:38 26 4
gpt4 key购买 nike

我想在使用 python xlib 发生更改焦点事件时检测应用程序窗口名称,因此在第一步中我使用此代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import Xlib.display
import time


display = Xlib.display.Display()
while True:
window = display.get_input_focus().focus
wmname = window.get_wm_name()
wmclass = window.get_wm_class()
if wmclass is None and wmname is None:
window = window.query_tree().parent
wmname = window.get_wm_name()
print "WM Name: %s" % ( wmname, )
time.sleep(3)

但我想要一个正确的方法,然后我研究了 xlib 事件并找到了 Input Focus Events并编写这段代码:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import Xlib.display
from Xlib import X

def main():
display = Xlib.display.Display(':0')
root = display.screen().root
root.change_attributes(event_mask=Xlib.X.FocusChangeMask)

while True:
event = root.display.next_event()
#if event.type == X.FocusIn or event.type == X.FocusOut:
if event.type == X.FocusOut :
window = display.get_input_focus().focus
wmname = window.get_wm_name()
wmclass = window.get_wm_class()
if wmclass is None and wmname is None:
window = window.query_tree().parent
wmname = window.get_wm_name()
print "WM Name: %s" % ( wmname, )

if __name__ == "__main__":
main()

遗憾的是,它无法正常工作,尤其是在 google chrome 和 firefox 的标签式浏览中,那么对于这种情况有正确的方法吗?

最佳答案

您的代码几乎是正确的,但遗漏了两点:

  • 与其只监听焦点变化,它还应该监听窗口属性事件,其中包括 WM_NAME 属性的变化,当您在浏览器中循环切换标签时也会发生这种情况。
  • 与其只在根窗口中监听,不如监听每个(获得焦点的)窗口。您可以像处理根窗口一样附加事件处理程序。

话虽这么说,这里是一个工作示例:

#!/usr/bin/python3
import Xlib
import Xlib.display

disp = Xlib.display.Display()
root = disp.screen().root

NET_WM_NAME = disp.intern_atom('_NET_WM_NAME')
NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW')

root.change_attributes(event_mask=Xlib.X.FocusChangeMask)
while True:
try:
window_id = root.get_full_property(NET_ACTIVE_WINDOW, Xlib.X.AnyPropertyType).value[0]
window = disp.create_resource_object('window', window_id)
window.change_attributes(event_mask=Xlib.X.PropertyChangeMask)
window_name = window.get_full_property(NET_WM_NAME, 0).value
except Xlib.error.XError: #simplify dealing with BadWindow
window_name = None
print(window_name)
event = disp.next_event()

关于python - 使用 python xlib 发生更改焦点事件时如何检测应用程序名称 “correctly”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23786289/

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