我需要检测用户何时在停靠菜单中按下“退出”。
我的应用程序实际上只是 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()
是理想的。