簡體   English   中英

Linux下用Python獲取活動窗口的進程

[英]Get the process of the active window with Python in Linux

在這些幫助下

在 X 中獲取活動窗口標題

使用 Python 獲取活動窗口

我已經設法找出活動窗口的名稱

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM