【问题标题】:Hide Dock icon without closing window隐藏 Dock 图标而不关闭窗口
【发布时间】:2012-11-02 23:47:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我有,在这些:stackoverflow.com/…,正如您在我的问题中看到的那样,这就是我已经做的事情,但是在转换流程类型时没有人会保持打开窗口。除非您参考该线程中的 KioskMode 链接,该链接用于隐藏整个 Dock,而不仅仅是一个图标。

标签: macos cocoa dock


【解决方案1】:

我偶然发现了this thread,其中建议使用以下方法来防止窗口被隐藏:

[window setCanHide:NO];

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

- (BOOL)windowShouldClose:(id)sender

【讨论】:

  • setCanHide 可以解决问题,谢谢!我之前试过windowShouldclose,但设置UIElement时似乎没有触发。
  • 既然你说,setCanHide 有效,应用程序只是被隐藏,并且由于窗口未关闭,windowShouldClose 委托调用不会被触发。
【解决方案2】:

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

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

斯威夫特:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多