2015-05-17 124 views
1

我嘗試顯示系統上每次點擊的當前窗口。在PyObjC中監聽onclick事件

我這樣做代碼:

from AppKit import NSWorkspace 

def getwindows(): 
    activeAppName = NSWorkspace.sharedWorkspace().activeApplication()['NSApplicationName'] 
    print activeAppName 
    return 

def main(): 
    getwindows() 

main() 

但是,只有當前窗口,當我安裝顯示腳本。

如何在一個循環中將此腳本綁定到點擊事件?

我已經嘗試使用Turtle,但附加了一些錯誤。

回答

1

請注意,不建議使用activeApplication方法NSWorkSpace。下面可以用來積極探索運行的應用程序的積極狀態:

import AppKit 
import time 
rl = AppKit.NSRunLoop.currentRunLoop() 
ws = AppKit.NSWorkspace.sharedWorkspace() 
for i in xrange(10): 
    for app in ws.runningApplications(): 
    if app.isActive(): 
     print "active app:", app.localizedName() 
    date = AppKit.NSDate.date() 
    time.sleep(1) 
    rl.acceptInputForMode_beforeDate_(AppKit.NSDefaultRunLoopMode, date) 

活動意味着它是接收鍵盤輸入。點擊一個應用程序將導致它變爲活動狀態。請注意,必須調用acceptInputForMode方法,以便在當前應用程序中反映屬性更改。運行這個程序,然後點擊各種其他應用程序 - 您應該看到活動的應用程序更改。

A類結合可以通過觀察來完成:

import AppKit 

ws = AppKit.NSWorkspace.sharedWorkspace() 
appL = ws.runningApplications() 

class MyClass(AppKit.NSObject): 
    def observeValueForKeyPath_ofObject_change_context_(self, 
      kpath, objid, change, context): 
    print "path change", kpath, change['new'], appL[context].localizedName() 

obj = MyClass.new() 
for i in xrange(len(appL)): 
    appL[i].addObserver_forKeyPath_options_context_(obj, 
      "isActive", AppKit.NSKeyValueObservingOptionNew, i) 

date = AppKit.NSDate.date().dateByAddingTimeInterval_(10) 
rl = AppKit.NSRunLoop.currentRunLoop() 
rl.acceptInputForMode_beforeDate_(AppKit.NSDefaultRunLoopMode, date) 

for app in appL: 
    app.removeObserver_forKeyPath_(obj, "isActive") 

運行此程序同樣爲上。

您還可以探測/觀察NSRunningApplication的其他一些屬性(例如hidden),但列表非常短。