首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LSUIElement=YES + kProcessTransformToForegroundApplication:重复的停靠图标

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

Stack Overflow用户
提问于 2012-08-19 17:47:01
回答 1查看 1.5K关注 0票数 4

我注意到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);似乎可以解决这个问题。然而,这不是一个好的方法,因为用户没有得到即时的反馈,应用程序已经启动。

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

EN

回答 1

Stack Overflow用户

发布于 2012-08-24 15:40:51

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

代码语言:javascript
复制
    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,并相应地设置它。

其次,如果他们在dock首选项中切换显示,我使用以下命令:

代码语言:javascript
复制
- (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);
    }
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12025586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档