我想制作一个无窗口的应用程序。问题是我使用的框架有时会显示一些警告框,而我无法抑制它们(至少没有崩溃)。
我已将LSBackgroundOnly
设置为1(在info.plist应用文件中),但这似乎不起作用。我有什么机会在这里遗漏一些东西(也许我需要设置一些其他设置)?
我也尝试为NSWindow
创建一个类别:
覆盖alloc
和allocWithZone:
,以便不会创建任何窗口。这适用于某些情况,但启动模态会话会引发异常(因为将nil参数发送到beginModalSessionForWindow:
)。
尝试覆盖NSApplication的beginModalSessionForWindow:
并且每次都返回nil,但这会导致框架中某处的EXC_BADACCESS(runModalSession:
和endModalSession:
也被覆盖,但崩溃发生在任何地方之前他们被称为。)
欢迎任何其他想法。
如果它有帮助,我使用的框架是Twain.Framework,所以如果有人知道阻止所有UI从twain(这包括设备未连接时显示的错误警报)的方法,它会很棒如果你分享。
答案 0 :(得分:0)
目前尚不清楚你的目标是什么。您是否希望应用程序通常不显示窗口但允许第三方框架显示其警报?或者您是否希望找到一种方法来阻止框架显示其警报,以便您的应用绝对从不有任何窗口?
如果是前者,你可能正在寻找LSUIElement。这是一个可以有一些UI元素的应用程序,但不会显示在Dock或Command-Tab应用程序切换器中,也没有菜单栏。
答案 1 :(得分:0)
我设法让它“无窗”(仍会显示一些窗口,但至少它们不可见,并且它们会自动关闭)。我只处理模态窗口,因为这些在我的情况下显示。
我为NSWindow
创建了一个类别,以便所有窗口都不可见,并且不能成为关键窗口或主窗口:
-(BOOL)canBecomeKeyWindow{
[self setOpaque:NO];
self.alphaValue = 0;
return NO;
}
-(BOOL)canBecomeMainWindow{
[self setOpaque:NO];
self.alphaValue = 0;
return NO;
}
Subclassed NSApplication
:
-(NSInteger)runModalForWindow:(NSWindow *)aWindow{
return NSCancelButton;
}
-(NSModalSession)beginModalSessionForWindow:(NSWindow *)aWindow{
NSModalSession session = [super beginModalSessionForWindow:aWindow];
[aWindow performSelector:@selector(close) withObject:nil afterDelay:1];
return session;
}
然而,这并没有多大帮助。如果runModalForWindow:
一切都很好,因为窗口的所有者收到了回复。如果beginModalSessionForWindow:
应用程序卡住了,很可能是因为窗口的所有者正在等待从未收到过的特定事件(例如按钮点击)。