ユーザーがドックメニューで「終了」を押したときを検出する必要があります。
私のアプリケーションは、実際には Web インターフェイスのバックエンド サーバーのランチャーにすぎません。起動されたプロセスが終了するのを手動で待機して(ポーリングとスリープを使用して)、ドックメニューに保持します。アクティビティ モニターが応答していないことを示したので、「タッチ」などのイベントを処理するネイティブ関数を追加しました。応答なしフラグはなくなりましたが、ユーザーはこのアプリケーションを終了できません (ネイティブ関数がイベントを処理するためだと思います)。
そのネイティブ関数にアクセスするために ctypes を使用しました。
TVB = subprocess.popen(args)
coreFoundation = cdll.LoadLibrary('/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation')
CFRunLoopRunInMode = coreFoundation.CFRunLoopRunInMode # the native function
CFRunLoopRunInMode.restype = c_int32 # its return type
CFRunLoopRunInMode.argtypes = [ c_void_p, c_double, c_bool ] # its arguments types
defaultMode = c_void_p.in_dll(coreFoundation, u'kCFRunLoopDefaultMode') # the default mode to process events
sleepTime = c_double(5) # the duration to process the events
retAfterSourceHandled = c_bool(0) # do NOT return after processing
while not TVB.poll(): # keep alive as long as TVB is alive
CFRunLoopRunInMode(defaultMode, sleepTime, retAfterSourceHandled)
sleep(5)
#detect 'quit' here and stop TVB, then quit
他の解決策も検討しCFRunLoopRunInMode
ます...のようなものprocessNextEvent()
が理想的です。