我想知道我的应用程序目前是否处于“模态”状态。
我知道,如果使用Cocoa的函数处于这种状态,我可以通过检查[[NSApplication sharedApplication] modalWindow]返回的位置是否为零来判断。
但它也可能是在模态状态使用碳的函数(RunAppModalLoopForWindow等),然后Cocoa的modalWindow没有告诉我们应用程序是否是模态的。
不幸的是,我没有选择避免碳,因为我的应用程序的老第三方插件使用它。
下面是由于碳造成的模式状态堆栈跟踪示例的一部分:
frame #12: 0x93ede739 CoreFoundation`__CFRunLoopRun + 1897
frame #13: 0x93eddd5a CoreFoundation`CFRunLoopRunSpecific + 394
frame #14: 0x93eddbbb CoreFoundation`CFRunLoopRunInMode + 123
frame #15: 0x930cee2d HIToolbox`RunCurrentEventLoopInMode + 259
frame #16: 0x930cebb2 HIToolbox`ReceiveNextEventCommon + 526
frame #17: 0x93119c4a HIToolbox`AcquireNextEventInMode + 75
frame #18: 0x93269aea HIToolbox`_AcquireNextEvent + 58
frame #19: 0x932585dc HIToolbox`_RunAppModalLoop + 168
frame #20: 0x932584ee HIToolbox`RunAppModalLoopForWindow + 130我可以跟踪堆栈并看到_RunAppModalLoop在那里,但我不喜欢这个解决方案。
发布于 2013-12-10 00:07:01
这可以通过枚举所有应用程序的窗口并使用GetWindowModality检查它们是否是模态来实现。
bool isAnyCarbonWindowModal()
{
for (
WindowRef win = GetFrontWindowOfClass(kAllWindowClasses, true);
win != nullptr;
win = GetNextWindowOfClass(win, kAllWindowClasses, true))
{
WindowModality modalKind;
WindowRef unavailableWindow;
GetWindowModality(win, &modalKind, &unavailableWindow);
if (kWindowModalityAppModal == modalKind)
return true;
}
return false;
}发布于 2013-12-09 12:04:38
您可以尝试检查来自GetWindowModality([[NSApp keyWindow] windowRef], ...)和/或应用于-mainWindow的输出。
发布于 2013-12-08 23:40:55
您可以看到-[NSRunLoop currentMode]是否为NSDefaultRunLoopMode。
但是,您可能会得到一个与您想要解决的问题更具体的问题不同的答案。
https://stackoverflow.com/questions/20333534
复制相似问题