显示模态NSWindow,而不激活其他应用程序窗口

时间:2010-12-19 18:48:39

标签: cocoa xcode macos modal-dialog nswindow

我有一个NSStatusItem正确显示在MenuBar中。其中一个项目(单击时)显示我的应用程序中的模态NSWindow,用于执行一次性任务,然后消失。 (例如,用户输入一小段文字,点击“保存”,模态NSWindow就会消失。)

当应用程序在后台运行时,会出现此问题。模态窗口正确显示在前台运行的任何应用程序之上,但是当用户单击“保存”按钮时,应用程序窗口的其余部分也将处于活动状态。这是不可取的,因为用户必须回到他们正在使用的任何应用程序。 (破坏NSStatusItem的便利性。)我正在使用以下方式显示模态窗口:

[myWindow setFrame:finalRect display:YES animate:NO];
[myWindow setLevel:NSPopUpMenuWindowLevel];
[NSApp runModalForWindow:myWindow];

有没有办法阻止弹出窗口中的点击/事件导致应用程序的其余部分变为活动状态?或者让NSApp知道这个特定面板不应该自动激活应用程序的其余部分的方法?谢谢!

4 个答案:

答案 0 :(得分:17)

不是创建NSWindow,而是使用样式NSPanel创建NSNonactivatingPanelMask。然后,您可以根据需要执行常规makeKeyAndOrderFront:orderOut:来显示/隐藏面板。

答案 1 :(得分:1)

几年前Ken Thomases在cocoa-dev列表中的解决方案也适用于此:

[[NSApplication sharedApplication] hide:self];
[[NSApplication sharedApplication] performSelector:@selector(unhideWithoutActivation) 
                                        withObject:nil 
                                        afterDelay:0.05];

理论上它告诉应用程序隐藏自己并取消隐藏在窗口堆栈的底部。

您还可以截取鼠标点击事件并使用[NSApp preventWindowOrdering]

答案 2 :(得分:1)

NSApp的beginModalSessionForWindow,runModalSession,endModalSession是您需要的方法。

看一看如何使用它: Creating a fully customized NSAlert

答案 3 :(得分:0)

您可以尝试以下内容:

...
if ([NSApp isHidden])
    [myWindow makeKeyAndOrderFront:self];
else
    [NSApp runModalForWindow:myWindow];
... 

完成时:

...
if ([NSApp isHidden])
    [myWindow orderOut:self];
else
    [NSApp stopModal];
...