7

我正在创建一个应用程序,我想让用户能够在运行时显示或隐藏停靠图标。我有一个带有复选框的首选项窗口,设置用户默认值,它使用 KVO 触发以下代码:

if (!hideDockIcon) {
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);
} else {
    TransformProcessType(&psn, kProcessTransformToUIElementApplication);
}

这可行,但是在隐藏时,首选项窗口会直接关闭(这很有意义,因为它现在是一个后台应用程序)。但是,我注意到 MS 的 SkyDrive 客户端设法隐藏图标,同时保持“首选项”窗口打开。我一直无法找出如何做到这一点,有人有想法吗?

我也尝试过使用[NSApp setActivationPolicy: NSApplicationActivationPolicyRegular]and NSApplicationActivationPolicyAccessory/NSApplicationActivationPolicyProhibited但这对我不起作用;Accessory不隐藏停靠图标,Prohibited也关闭窗口并且似乎[NSApp activateIgnoringOtherApps:YES]被忽略了。

4

2 回答 2

5

我偶然发现了这个线程,建议执行以下操作以防止隐藏窗口:

[window setCanHide:NO];

这只是涵盖隐藏。如果您的窗口关闭,您可能会尝试使用窗口委托?有一个电话可以让你防止窗口被关闭

- (BOOL)windowShouldClose:(id)sender
于 2012-11-14T17:26:00.007 回答
1

我通过不在同一个运行循环中激活应用程序解决了这个问题:

dispatch_async(dispatch_get_main_queue(), ^{
    [NSApp activateIgnoringOtherApps:YES];
});

迅速:

dispatch_async(dispatch_get_main_queue()) { 
    NSApp.activateIgnoringOtherApps(true)
}

我正在调用 dispatch_async 来安排块在几纳秒后的下一个运行循环之一中执行。这使进程有机会完成隐藏自己。

于 2016-08-07T15:18:26.543 回答