感谢@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"):
^{pr2}$
以及进程的名称("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.+)$', 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.+)$', 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.+)$', 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的进程名,因为某些原因,RStudio没有窗口名("WM_NAME")。在