如何判断全屏应用程序是否正在运行?

时间:2009-08-30 23:26:40

标签: python linux x11

是否可以在python中判断linux上的全屏应用程序是否正在运行? 我觉得有可能使用Xlib,但我找不到办法。

编辑:全屏我的意思是整个屏幕除了应用程序之外别无其他,例如全屏游戏。

3 个答案:

答案 0 :(得分:4)

如果您有兴趣在支持EWMH,扩展窗口管理器提示标准下运行的所有窗口管理器,有优雅的方法来执行此操作(例如,通过ctypes与Xlib对话)。根窗口的_NET_ACTIVE_WINDOW属性(参见here)告诉您哪个窗口是活动的(如果有的话);然后,活动窗口的_NET_WM_STATE属性是描述其状态的原子列表,如果该窗口是全屏的,则包括_NET_WM_STATE_FULLSCREEN。 (如果你有多个显示器,当然一个窗口可以全屏显示其中一个没有激活;我相信其他情况可能存在一个窗口可能是全屏但没有活动 - 我认为没有任何方法可以覆盖它们所有这些都没有基本上为每个窗口检查_NET_WM_STATE

答案 1 :(得分:3)

找到解决方案:

import Xlib.display

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

num_of_fs = 0
for window in root_win.query_tree()._data['children']:
    window_name = window.get_wm_name()
    width = window.get_geometry()._data["width"]
    height = window.get_geometry()._data["height"]

    if width == screen.width_in_pixels and height == screen.height_in_pixels:
        num_of_fs += 1

print num_of_fs

这打印出全屏窗口的数量,对我来说通常是一个。当玩全屏游戏时2。

答案 2 :(得分:1)

只是更新以赛亚发布的代码,这对我不起作用。

这是一个初步版本,可以简化,在我的测试中它运行良好,此代码是名为 xkeysnail 的项目的一部分,它在获取窗口名称方面运行良好。

import sys
from time import sleep
import Xlib.display

def window_is_fullscreen(display=Xlib.display.Display()):
    """Check if window is fullscreen or not."""
    focused_window = display.get_input_focus().focus
    screen = display.screen()
    wm_info = win_width = get_focused_window_info(focused_window)
    win_width = get_focused_window_info(focused_window)['width']
    win_height = get_focused_window_info(focused_window)['height']
    reso = get_desktop_resolution(screen)
    # Desktop environments in general should appear in fullscreen,
    # generating false positives, a way to ignore them is necessary.
    if wm_info['class'] != 'xfdesktop':
        if win_width == reso['width'] and win_height == reso['height']:
            return True
        else:
            return False

def get_desktop_resolution(screen):
    """Get desktop resolution."""
    return {
        'width': screen.width_in_pixels, 
        'height': screen.height_in_pixels
    }

def get_focused_window_info(window):
    """Get info from focused window'"""
    wmname = window.get_wm_name()
    try:
        wmclass = window.get_wm_class()[0]
    except TypeError:
        wmclass = window.get_wm_class()
        pass
    wm_data = window.get_geometry()._data
    width = wm_data['width']
    height = wm_data['height']
    # workaround for Java app
    # https://github.com/JetBrains/jdk8u_jdk/blob/master/src/solaris/classes/sun/awt/X11/XFocusProxyWindow.java#L35
    if not wmclass and not wmname or "FocusProxy" in wmclass:
        parent_window = window.query_tree().parent
        if parent_window:
            return get_focused_window_info(parent_window)
    elif wmclass and wmname:
        return {'class': wmclass, 'name': wmname, 'width': width, 'height': height}
    elif wmclass and not wmname:
        return {'class': wmclass, 'width': width, 'height': height}
    elif not wmclass and wmname:
        return {'name': wmname, 'width': width, 'height': height}
    return None
    
while True:
    try:
        print(window_is_fullscreen(), end='\r')
        sleep(1)
    except KeyboardInterrupt:
        sys.exit(0)