2017-08-24 94 views
0

在我的python脚本中,我必须确定实际的活动窗口/应用程序对远程事件(lirc)应用程序的响应。所以我试图像描述here那样重新设计它。但测试码用wnck(python)确定活动窗口/应用程序失败

import wnck, time 

run = True 
while run: 
    try: 
     time.sleep(1) 
     screen = wnck.screen_get_default() 
     #screen.force_update() 
     print screen.get_active_window().get_name() 
     print screen.get_previously_active_window() 
    except KeyboardInterrupt: 
     run = False 

导致这个输出

.lirc : python — Konsole 
None 
.lirc : python — Konsole 
None 
.lirc : python — Konsole 
None 
.lirc : python — Konsole 
None 
.lirc : python — Konsole 
None 

即使我切换到另一个窗口。所以我重复执行,并用time.sleep(1)延迟执行。由远程事件(lirc)执行的结果是相同的。只有在python外壳中它才能工作(screen.get_previously_active_window()有正确的结果)。该脚本已在Kubuntu 16.04的终端窗口(konsole)内执行。我已经测试过插入screen.force_update(),但没有成功。

我做错了什么?

谢谢

回答

0

我已经用Xlib解决了它。这种方式独立运作。这里是一个示例代码:

import Xlib 
import Xlib.display 
import time 

run = True 
while run: 
    try: 
     time.sleep(1) 

     display = Xlib.display.Display() 
     root = display.screen().root 
     windowID = root.get_full_property(display.intern_atom('_NET_ACTIVE_WINDOW'), Xlib.X.AnyPropertyType).value[0] 
     window = display.create_resource_object('window', windowID) 

     print window.get_wm_name() 
     print window.get_full_property(display.intern_atom('_NET_WM_PID'), Xlib.X.AnyPropertyType).value[0] 
     print window.get_full_property(display.intern_atom('_NET_WM_NAME'), Xlib.X.AnyPropertyType).value[0] 
     print window.get_full_property(display.intern_atom('_NET_WM_VISIBLE_NAME'), Xlib.X.AnyPropertyType) 
     print window.get_wm_class() 
    except KeyboardInterrupt: 
     run = False 

这里显示了一些关于该窗口的可能的信息。在我最后的剧本中,我使用了window.get_wm_class()