如何判断应用程序是否处于模态状态

时间:2013-12-02 16:51:42

标签: macos modal-dialog macos-carbon

我希望能够判断我的应用程序当前是否处于“模态”状态。

我知道如果它处于使用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在那里,但我不喜欢这个解决方案。

3 个答案:

答案 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;
}