是否可以在python中判断linux上的全屏应用程序是否正在运行? 我觉得有可能使用Xlib,但我找不到办法。
编辑:全屏我的意思是整个屏幕除了应用程序之外别无其他,例如全屏游戏。
答案 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)