隐藏Dock图标而不关闭窗口

时间:2012-11-14 13:15:52

标签: macos cocoa dock

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

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

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

我还尝试使用[NSApp setActivationPolicy: NSApplicationActivationPolicyRegular]NSApplicationActivationPolicyAccessory / NSApplicationActivationPolicyProhibited,但这对我不起作用; Accessory未隐藏停靠栏图标,Prohibited也会关闭窗口,似乎会忽略[NSApp activateIgnoringOtherApps:YES]

3 个答案:

答案 0 :(得分:0)

hiddenIf我使用

[window setCanHide:NO];

它确实会阻止窗口在移动到NSApplicationActivationPolicyAccessory时隐藏,但是我无法隐藏应用程序。有没有办法隐藏停靠栏图标,保持窗口打开,但允许隐藏应用程序?

我有一个菜单状态项,可用于取消隐藏应用。

答案 1 :(得分:0)

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

services:
     sitemap.listener:
         class: AppBundle\EventListener\SitemapListener
         arguments:
            - ["@router"]
         tags: [{name: "presta.sitemap.listener"}]

夫特:

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

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

答案 2 :(得分:-1)

我偶然发现了this thread,建议以下内容阻止隐藏窗口:

[window setCanHide:NO];

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

- (BOOL)windowShouldClose:(id)sender