gpt4 book ai didi

macos - LSUIElement=是 + kProcessTransformToForegroundApplication : duplicated dock icons

转载 作者:行者123 更新时间:2023-12-03 16:14:32 25 4
gpt4 key购买 nike

我注意到 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。

最佳答案

我将用户的首选项保存到 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 中)是还是否,并进行相应设置。

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

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

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

关于macos - LSUIElement=是 + kProcessTransformToForegroundApplication : duplicated dock icons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12025586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com