我希望能够判断我的应用程序当前是否处于“模态”状态。
我知道如果它处于使用Cocoa函数的状态,我可以通过检查[[NSApplication sharedApplication] modalWindow]
返回nil的位置来判断。
但它也可以使用Carbon的函数(RunAppModalLoopForWindow
等)处于模态状态,然后Cocoa的modalWindow
不会告诉我们应用程序是否是模态的。
不幸的是,我没有选择避免使用Carbon,因为我的应用程序托管使用它的旧第三方插件。
以下是由于碳的模态状态的示例堆栈跟踪的一部分:
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
在那里,但我不喜欢这个解决方案。
答案 0 :(得分:1)
您可以尝试检查GetWindowModality([[NSApp keyWindow] windowRef], ...)
的输出和/或应用于-mainWindow
的输出。
答案 1 :(得分:0)
您可以看到-[NSRunLoop currentMode]
是NSDefaultRunLoopMode
。
但是,对于您尝试解决的问题,您可能会得到一个不同的答案。
答案 2 :(得分:0)
这可以通过枚举所有应用程序的窗口并使用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;
}