首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何判断应用程序是否处于模态状态

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

Stack Overflow用户
提问于 2013-12-02 16:51:41
回答 3查看 513关注 0票数 1

我想知道我的应用程序目前是否处于“模态”状态。

我知道,如果使用Cocoa的函数处于这种状态,我可以通过检查[[NSApplication sharedApplication] modalWindow]返回的位置是否为零来判断。

但它也可能是在模态状态使用碳的函数(RunAppModalLoopForWindow等),然后Cocoa的modalWindow没有告诉我们应用程序是否是模态的。

不幸的是,我没有选择避免碳,因为我的应用程序的老第三方插件使用它。

下面是由于碳造成的模式状态堆栈跟踪示例的一部分:

代码语言:javascript
复制
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在那里,但我不喜欢这个解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-10 00:07:01

这可以通过枚举所有应用程序的窗口并使用GetWindowModality检查它们是否是模态来实现。

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2013-12-09 12:04:38

您可以尝试检查来自GetWindowModality([[NSApp keyWindow] windowRef], ...)和/或应用于-mainWindow的输出。

票数 1
EN

Stack Overflow用户

发布于 2013-12-08 23:40:55

您可以看到-[NSRunLoop currentMode]是否为NSDefaultRunLoopMode

但是,您可能会得到一个与您想要解决的问题更具体的问题不同的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20333534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档