有沒有辦法知道(linux x windows)用戶何時通過alt-tab或單擊來更改活動窗口。我想寫一個腳本來監聽這個事件(如果發生這樣的事件,腳本會繼續查找當前活動窗口 - 我知道該如何解決)。我也可以通過輪詢來找到當前的活動窗口,但這是寫這個不好的方法。希望得到一個可以「傾聽」而不是「投票」的解決方案。在活動窗口捕獲更改(對於Linux)
謝謝!
有沒有辦法知道(linux x windows)用戶何時通過alt-tab或單擊來更改活動窗口。我想寫一個腳本來監聽這個事件(如果發生這樣的事件,腳本會繼續查找當前活動窗口 - 我知道該如何解決)。我也可以通過輪詢來找到當前的活動窗口,但這是寫這個不好的方法。希望得到一個可以「傾聽」而不是「投票」的解決方案。在活動窗口捕獲更改(對於Linux)
謝謝!
只需簡要查看Perl模塊X11 :: Tops的文檔,即可瞭解monitor_property_and_structure_change方法。因此,我會猜測底層的X11庫將提供您正在尋找的功能。
我瞭解KTimeTracker KDE程序,該程序會跟蹤您在每個窗口花費了多少時間。我不知道細節 - 是否跟蹤更改活動窗口的事件,或者只是定期檢查整個桌面的狀態。不過,來源可能會有所幫助:http://www.kde.org/applications/utilities/ktimetracker/。
我需要這樣做,我的解決方案是在根窗口上觀察屬性(由Window Manager維護)以進行更改。
這裏的蟒蛇,Xlib的實現我寫信給它展示給別人的副本:
import Xlib
import Xlib.display
disp = Xlib.display.Display()
root = disp.screen().root
NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW')
NET_WM_NAME = disp.intern_atom('_NET_WM_NAME')
last_seen = {'xid': None}
def get_active_window():
window_id = root.get_full_property(NET_ACTIVE_WINDOW,
Xlib.X.AnyPropertyType).value[0]
focus_changed = (window_id != last_seen['xid'])
last_seen['xid'] = window_id
return window_id, focus_changed
def get_window_name(window_id):
try:
window_obj = disp.create_resource_object('window', window_id)
window_name = window_obj.get_full_property(NET_WM_NAME, 0).value
except Xlib.error.XError:
window_name = None
return window_name
if __name__ == '__main__':
root.change_attributes(event_mask=Xlib.X.PropertyChangeMask)
while True:
win, changed = get_active_window()
if changed:
print(get_window_name(win))
while True:
event = disp.next_event()
if (event.type == Xlib.X.PropertyNotify and
event.atom == NET_ACTIVE_WINDOW):
break
更完全註釋的版本是this gist。
您是否找到答案? – 2015-08-22 23:13:32