[英]Get the process of the active window with Python in Linux
在這些幫助下
我已經設法找出活動窗口的名稱
import os, re, sys
from subprocess import PIPE, Popen
def get_active_window_title():
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 )
window = Popen( ['xprop', '-id', window_id, 'WM_NAME'], stdout = PIPE )
stdout, stderr = window.communicate()
match = re.match( b'WM_NAME\(\w+\) = (?P<name>.+)$', stdout )
if match is not None:
return match.group( 'name' ).decode( 'UTF-8' ).strip( '"' )
return 'Active window not found'
if __name__ == '__main__':
print( get_active_window_title() )
但是,我也對控制窗口的進程名稱(firefox、rstudio...)感興趣。
關於如何進行的任何想法?
謝謝@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"
)。
看看這個答案。 它使用一個名為xprop
和一個名為wmctrl
的命令行工具來獲取活動窗口的 PID。 獲得 PID 后,您幾乎可以獲得有關該過程的任何信息。 例如,要獲取進程的名稱,可以使用 python subprocess
模塊執行以下命令:
ps -p 1337 -o comm=
上面會給你命令的名字,而這個:
ps -p 1337 -o command=
會給你命令的完整路徑。
示例(Ubuntu 17.10):
命令:
ps -p 1 -o comm=
輸出:
init
命令:
ps -p 1 -o command=
輸出:
/sbin/init
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.