【问题标题】:LSUIElement=YES + kProcessTransformToForegroundApplication: duplicated dock iconsLSUIElement=YES + kProcessTransformToForegroundApplication:重复的停靠图标
【发布时间】:2012-08-19 09:47:01
【问题描述】:

我注意到在 10.7.3 及更高版本(也低于 10.8)下出现了一些奇怪的行为。

我的应用程序是一个小助手应用程序,默认情况下有一个 NSStatusItem 和一个停靠图标。用户可以配置,如果他只想显示 StatusItem、Dock 图标或两者。 为了实现这一点,我在 Info.plist 中有LSUIElement=YES。如果用户已配置要显示的 Dock-Icon 我正在做

TransformProcessType(& (ProcessSerialNumber){ 0, kCurrentProcess }, kProcessTransformToForegroundApplication);

在 applicationDidFinishLaunching 中。

这在 10.7.3 之前运行良好。从 10.7.3 开始,停靠图标有时会显示两次(尽管只有一个应用程序实例正在运行)。在这种情况下,应用程序可以正常终止,但第二个图标在 Dock 中仍然没有响应。重新启动扩展坞会使图标消失。这主要发生在应用程序是 LoginItem 并在登录时自动启动的情况下。 延迟 1 秒或更长时间执行 TransformProcessType(& (ProcessSerialNumber){ 0, kCurrentProcess }, kProcessTransformToForegroundApplication); 似乎可以解决问题。然而,这不是一个好方法,因为用户没有得到即时反馈,表明应用程序已启动。

有人知道这个问题和可能的解决方法/解决方案吗?一些谷歌搜索显示 Growl 似乎从 10.7.3 开始也有这个问题,但没有任何解决方案。 注意:设置LSUIElement=NO 并使用kProcessTransformToUIElementApplication,如果用户选择不显示停靠图标对我不起作用,因为应用程序需要与 10.5 和 10.6 兼容。

【问题讨论】:

  • 如果你能找到一个你满意的运行时检查(试试stackoverflow.com/a/11072974/774691),它会让你知道执行环境是 10.7.3 或更早版本还是 10.7.4 或更高版本,您可能有自己的解决方案……执行测试,并有条件地执行您一直在执行的操作或您在最后一段中提出的建议。

标签: macos cocoa dock info.plist


【解决方案1】:

我将用户的首选项保存到 NSUserDefaults,我会做两件事:首先,在 applicationDidFinishLaunching 中检查应用启动:

    if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"ShowInDock"] boolValue]) {
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}  else {
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToUIElementApplication);
}

if 检查用户偏好(保存在standardUserDefaults 中)是yes 还是no,并进行相应设置。

其次,如果他们在停靠首选项中切换显示,我会使用这个:

- (IBAction)toggleShowInDock:(id)sender {
if ([showInDockPreference state] == NSOnState) {
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:YES] forKey:@"ShowInDock"];
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
}  else {
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:NO] forKey:@"ShowInDock"];
    ProcessSerialNumber psn = { 0, kCurrentProcess };
    TransformProcessType(&psn, kProcessTransformToUIElementApplication);
    }
}

我从来没有遇到过使用这个的双图标问题。希望对您有所帮助。

【讨论】:

  • 此解决方案与 OS X 10.5 和 10.6 不兼容。在 Lion 中引入了 kProcessTransformToUIElementApplication。
  • 那么我会说这可能是您如何保存用户首选项的问题,这可能会在启动后发送消息以显示停靠图标,并在检查设置时再次显示。如果我们能看到您如何保存首选项,这可能会有所帮助。
  • 不。事实并非如此。变换 TransformProcessType(&psn, kProcessTransformToForegroundApplication) 只执行一次。正如我所解释的,这很可能是从 10.7.3 开始的操作系统中的一个错误。所以我正在寻找一种解决方法......
  • 好吧,现在也许检查一下您可以摆脱的延迟时间有多短。也许您可以将其降低到十分之一秒,用户几乎察觉不到。
  • 感谢您的建议。不幸的是,它至少需要一秒钟或更长时间才能可靠,这不是很方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2011-04-29
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多