Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
捕获活动窗口中的更改(适用于linux)_Linux_X11 - Fatal编程技术网

捕获活动窗口中的更改(适用于linux)

捕获活动窗口中的更改(适用于linux),linux,x11,Linux,X11,是否有办法知道(linux x windows)用户何时通过alt选项卡或单击更改活动窗口。我想写一个脚本来监听这个事件(如果发生这样的事件,脚本会继续查找当前的活动窗口——我知道如何解决这个问题)。我也可以继续轮询以查找当前活动窗口,但这是一种糟糕的编写方法。希望得到一个可以“倾听”而不是“投票”的解决方案 谢谢 只要简单浏览一下Perl模块X11::Tops的文档,就会发现有一个monitor\u property\u和\u structure\u change方法。因此,我猜想底层X11库

是否有办法知道(linux x windows)用户何时通过alt选项卡或单击更改活动窗口。我想写一个脚本来监听这个事件(如果发生这样的事件,脚本会继续查找当前的活动窗口——我知道如何解决这个问题)。我也可以继续轮询以查找当前活动窗口,但这是一种糟糕的编写方法。希望得到一个可以“倾听”而不是“投票”的解决方案


谢谢

只要简单浏览一下Perl模块X11::Tops的文档,就会发现有一个monitor\u property\u和\u structure\u change方法。因此,我猜想底层X11库将提供您所需要的功能

我知道KTimeTracker KDE程序,它跟踪您在每个窗口中花费的时间。我不知道细节——它是跟踪活动窗口的更改事件,还是只是定期检查整个桌面的状态。不过,源代码可能会有所帮助:。

我需要这样做,我的解决方案是查看根窗口上的
\u NET\u ACTIVE\u WINDOW
属性(由窗口管理器维护)以了解更改

下面是我编写的python xlib实现的一个副本,用于向某人演示:

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

更完整的评论版本在中。

您找到答案了吗?