感谢 @AnttiHaapala 和 @Steampunkery 的提示。基于它们,我设法将我的原始代码修改为答案。
使用xprop -root 我得到window_id:
root = Popen( ['xprop', '-root', '_NET_ACTIVE_WINDOW'], stdout = PIPE )
stdout, stderr = root.communicate()
m = re.search( b'^_NET_ACTIVE_WINDOW.* ([\w]+)$', stdout )
window_id = m.group( 1 )
使用window_id 和xprop -id,我得到了窗口名称("WM_NAME"):
window = Popen( ['xprop', '-id', window_id, 'WM_NAME'], stdout = PIPE )
stdout, stderr = window.communicate()
wmatch = re.match( b'WM_NAME\(\w+\) = (?P<name>.+)$', stdout )
windowname = wmatch.group( 'name' ).decode( 'UTF-8' ).strip( '"' )
以及进程的名称 ("WM_CLASS"):
processname1, processname2 = None, None
process = Popen( ['xprop', '-id', window_id, 'WM_CLASS'], stdout = PIPE )
stdout, stderr = process.communicate()
pmatch = re.match( b'WM_CLASS\(\w+\) = (?P<name>.+)$', stdout )
processname1, processname2 = pmatch.group( 'name' ).decode( 'UTF-8' ).split( ', ' )
带有一些错误检查等的完整代码:
import os, re, sys, time
from subprocess import PIPE, Popen
def get_activityname():
root = Popen( ['xprop', '-root', '_NET_ACTIVE_WINDOW'], stdout = PIPE )
stdout, stderr = root.communicate()
m = re.search( b'^_NET_ACTIVE_WINDOW.* ([\w]+)$', stdout )
if m is not None:
window_id = m.group( 1 )
windowname = None
window = Popen( ['xprop', '-id', window_id, 'WM_NAME'], stdout = PIPE )
stdout, stderr = window.communicate()
wmatch = re.match( b'WM_NAME\(\w+\) = (?P<name>.+)$', stdout )
if wmatch is not None:
windowname = wmatch.group( 'name' ).decode( 'UTF-8' ).strip( '"' )
processname1, processname2 = None, None
process = Popen( ['xprop', '-id', window_id, 'WM_CLASS'], stdout = PIPE )
stdout, stderr = process.communicate()
pmatch = re.match( b'WM_CLASS\(\w+\) = (?P<name>.+)$', stdout )
if pmatch is not None:
processname1, processname2 = pmatch.group( 'name' ).decode( 'UTF-8' ).split( ', ' )
processname1 = processname1.strip( '"' )
processname2 = processname2.strip( '"' )
return {
'windowname': windowname,
'processname1': processname1,
'processname2': processname2
}
return {
'windowname': None,
'processname1': None,
'processname2': None
}
if __name__ == '__main__':
a = get_activityname()
print( '''
'windowname': %s,
'processname1': %s,
'processname2': %s
''' % ( a['windowname'], a['processname1'], a['processname2'] ) )
这应该返回窗口的名称以及控制进程。它甚至可以获取 RStudio 的进程名称,由于某种原因,它没有窗口名称 ("WM_NAME")。