2014-02-28 107 views
2

我正在編寫一個腳本,記錄每天在每個應用程序上花費多少時間。 但我不知道如何獲得我關注的過程及其名稱。 我該如何做到這一點?順便說一句,我看到很多方法來獲得聚焦的窗口ID。 我可以用它來獲取進程名稱嗎?Python - 我如何獲得Ubuntu上關注窗口的進程名稱(不是窗口標題)

+0

因此,它不是一個真正的DUP,但供參考:http://stackoverflow.com/questions/151407/how-to-get-an-x11-window-from-a-process-id and http://stackoverflow.com/questions/2041532/getting-pid-and-details-for-topmost-window – zmo

回答

2

你想要的是使用python-xlib你想查找的地方events

由於使用的例子,我用它來創建kitt,處理上Xorg的多點觸控手勢的東西:

下面的代碼:

from Xlib import X, XK, protocol, display, Xcursorfont 
from Xlib.ext import xtest 
from Xlib.protocol import request 

disp = display.Display() 

root = disp.screen().root 
pointer_info = request.QueryPointer(display = disp.display, 
            window = root) 
root_xpos, root_ypos = (pointer_info._data['root_x'], pointer_info._data['root_y']) 
targetwindow = disp.get_input_focus().focus 

現在一次你得到了targetwindow,你可以得到很多東西,如id。

現在,要回你的問題「如何讓一個窗口的PID」,得到的回答是,這是 不太可能的,因爲several reasons, 雖然有周圍的黑客。

這些黑客背後的想法是,雖然你不知道什麼確切的進程(和它的PID)正在運行窗口,你可以知道它的全名。您不能這樣做,因爲Xorg是一個客戶端 - 服務器系統,其中應用程序可以是遠程計算機上運行的進程,它可以具有與本地進程相同的PID。但是,黑客的想法是獲取程序的全名(使用WM_CLASS屬性),並從進程列表中猜出PID。

最明顯的,使用xprop

ps -o pid,comm,args $(xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}") -f _NET_WM_PID 0c " \$0\\n" _NET_WM_PID | awk "{print \$2}") 

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) _NET_WM_NAME WM_CLASS 

甚至使用xdotool

但是,回到我們使用的Xlib,我敢肯定它可以用代碼來實現 像that one, 雖然我沒有爲一個現成的代碼,但你必須檢查那裏的WM_CLASS屬性。其中將包含如在進程列表中的應用程序的名稱...田田\ O/

HTH

+0

謝謝你的建議。我會嘗試。 – MangoKing

相關問題