1

我想做一个无窗口的应用程序。问题是我使用的框架有时会显示一些警报框,并且我无法抑制它们(至少不会发生崩溃)。

我已设置LSBackgroundOnly为 1(在 info.plist 应用程序文件中),但这似乎不起作用。有没有可能我在这里遗漏了一些东西(也许我需要设置一些其他设置)?

我也尝试过为NSWindow

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

  2. 尝试覆盖 NSApplicationbeginModalSessionForWindow:并每次都返回 nil,但这会导致框架中某处的 EXC_BADACCESS (runModalSession:并且endModalSession:也被覆盖,但崩溃发生在它们中的任何一个被调用之前)。

欢迎任何其他想法。

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

4

2 回答 2

0

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

  1. 我为 做了一个类别NSWindow,这样所有的窗口都是不可见的,并且不能成为键或主窗口:

    -(BOOL)canBecomeKeyWindow{
       [self setOpaque:NO];
       self.alphaValue = 0;
       return NO;
    }
    -(BOOL)canBecomeMainWindow{
       [self setOpaque:NO];
       self.alphaValue = 0;
       return NO;
    }
    
  2. 子类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:应用程序卡住了,很可能是因为窗口的所有者正在等待它从未收到的特定事件(例如按钮单击)。

于 2012-04-09T07:22:14.473 回答
0

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

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

于 2012-04-05T20:01:41.453 回答