LSUIElement = YES + kProcessTransformToForegroundApplication:重复的停靠图标

时间:2012-08-19 09:47:01

标签: macos cocoa dock info.plist

我注意到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开始,停靠图标有时会显示两次(尽管只有一个应用程序实例正在运行)。在这种情况下,应用程序可以正常终止,但第二个图标在停靠栏中仍然无响应。重新启动扩展坞会使图标消失。如果应用程序是LoginItem并且在登录时自动启动,则会发生这种情况。 延迟1秒或更长时间执行TransformProcessType(& (ProcessSerialNumber){ 0, kCurrentProcess }, kProcessTransformToForegroundApplication);似乎可以解决问题。然而,这并不是一个好方法,因为用户没有得到即时反馈,应用程序已经启动。

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

1 个答案:

答案 0 :(得分:3)

我将用户的偏好保存到NSUserDefaults,我做了两件事:首先,在appDidFinishLaunching中检查app启动时间:

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

if检查用户首选项(保存在standardUserDefaults中)是“是”还是“否”,并相应地设置它。

其次,如果他们在码头偏好中切换节目,我会使用:

- (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);
    }
}

我从来没有使用过这个双图标问题。希望它有所帮助。