防止窗户打开(无窗口应用程序)

时间:2012-04-05 08:17:00

标签: objective-c macos cocoa

我想制作一个无窗口的应用程序。问题是我使用的框架有时会显示一些警告框,而我无法抑制它们(至少没有崩溃)。

我已将LSBackgroundOnly设置为1(在info.plist应用文件中),但这似乎不起作用。我有什么机会在这里遗漏一些东西(也许我需要设置一些其他设置)?

我也尝试为NSWindow创建一个类别:

  1. 覆盖allocallocWithZone:,以便不会创建任何窗口。这适用于某些情况,但启动模态会话会引发异常(因为将nil参数发送到beginModalSessionForWindow:)。

  2. 尝试覆盖NSApplication的beginModalSessionForWindow:并且每次都返回nil,但这会导致框架中某处的EXC_BADACCESS(runModalSession:endModalSession:也被覆盖,但崩溃发生在任何地方之前他们被称为。)

  3. 欢迎任何其他想法。

    如果它有帮助,我使用的框架是Twain.Framework,所以如果有人知道阻止所有UI从twain(这包括设备未连接时显示的错误警报)的方法,它会很棒如果你分享。

2 个答案:

答案 0 :(得分:0)

目前尚不清楚你的目标是什么。您是否希望应用程序通常不显示窗口但允许第三方框架显示其警报?或者您是否希望找到一种方法来阻止框架显示其警报,以便您的应用绝对从不有任何窗口?

如果是前者,你可能正在寻找LSUIElement。这是一个可以有一些UI元素的应用程序,但不会显示在Dock或Command-Tab应用程序切换器中,也没有菜单栏。

答案 1 :(得分:0)

我设法让它“无窗”(仍会显示一些窗口,但至少它们不可见,并且它们会自动关闭)。我只处理模态窗口,因为这些在我的情况下显示。

  1. 我为NSWindow创建了一个类别,以便所有窗口都不可见,并且不能成为关键窗口或主窗口:

    -(BOOL)canBecomeKeyWindow{
       [self setOpaque:NO];
       self.alphaValue = 0;
       return NO;
    }
    -(BOOL)canBecomeMainWindow{
       [self setOpaque:NO];
       self.alphaValue = 0;
       return NO;
    }
    
  2. 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;
    }
    
  3. 然而,这并没有多大帮助。如果runModalForWindow:一切都很好,因为窗口的所有者收到了回复。如果beginModalSessionForWindow:应用程序卡住了,很可能是因为窗口的所有者正在等待从未收到过的特定事件(例如按钮点击)。