我有一个NSStatusItem
正确显示在MenuBar中。其中一个项目(单击时)显示我的应用程序中的模态NSWindow,用于执行一次性任务,然后消失。 (例如,用户输入一小段文字,点击“保存”,模态NSWindow就会消失。)
当应用程序在后台运行时,会出现此问题。模态窗口正确显示在前台运行的任何应用程序之上,但是当用户单击“保存”按钮时,应用程序窗口的其余部分也将处于活动状态。这是不可取的,因为用户必须回到他们正在使用的任何应用程序。 (破坏NSStatusItem的便利性。)我正在使用以下方式显示模态窗口:
[myWindow setFrame:finalRect display:YES animate:NO];
[myWindow setLevel:NSPopUpMenuWindowLevel];
[NSApp runModalForWindow:myWindow];
有没有办法阻止弹出窗口中的点击/事件导致应用程序的其余部分变为活动状态?或者让NSApp知道这个特定面板不应该自动激活应用程序的其余部分的方法?谢谢!
答案 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];
...