制作一个复选框来打开和关闭 Dock 图标

Posted

技术标签:

【中文标题】制作一个复选框来打开和关闭 Dock 图标【英文标题】:Making a Checkbox Toggle The Dock Icon On and Off 【发布时间】:2009-07-04 15:10:28 【问题描述】:

如果选中,我如何使复选框隐藏停靠图标? 我已经制作了一个复选框来切换菜单栏项,但是您将如何使用停靠图标来执行此操作? 寻找一些代码来做到这一点。 谢谢!

【问题讨论】:

查看我对类似 SO 问题的评论:***.com/a/68057340/1418981。在 macOS 11 上测试并运行。 【参考方案1】:

Swift 的更新,上面已经介绍了两种使用方式(它们给出相同的结果):

public class func toggleDockIcon_Way1(showIcon state: Bool) -> Bool 
    // Get transform state.
    var transformState: ProcessApplicationTransformState
    if state 
        transformState = ProcessApplicationTransformState(kProcessTransformToForegroundApplication)
    
    else 
        transformState = ProcessApplicationTransformState(kProcessTransformToUIElementApplication)
    

    // Show / hide dock icon.
    var psn = ProcessSerialNumber(highLongOfPSN: 0, lowLongOfPSN: UInt32(kCurrentProcess))
    let transformStatus: OSStatus = TransformProcessType(&psn, transformState)
    return transformStatus == 0


public class func toggleDockIcon_Way2(showIcon state: Bool) -> Bool 
    var result: Bool
    if state 
        result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Regular)
    
    else 
        result = NSApp.setActivationPolicy(NSApplicationActivationPolicy.Accessory)
    
    return result

【讨论】:

使用此方法隐藏图标也会隐藏应用程序本身。我有一个计时器让它再次出现(没有菜单),但这只是糟糕的用户体验【参考方案2】:

我用过这个代码:

BOOL iconInDock = [[NSUserDefaults standardUserDefaults] boolForKey:smHideShowIcon];
if (iconInDock) 
    ProcessSerialNumber psn =  0, kCurrentProcess ;
    // display dock icon
    TransformProcessType(&psn, kProcessTransformToForegroundApplication);

好的,如果我在 Info.plist 中设置 LSUIElement=1,它对我的​​应用程序有效。该代码仅适用于显示,但我如何隐藏图标?

【讨论】:

这不是和其他答案中的代码完全一样吗? 为什么即使我已经导入了框架,也会出现这些错误? pupsor.com/wp-content/uploads/2009/07/Joshua.zip 它是带有示例工作显示的项目存档。尝试并发送结果 谢谢!我已经让它工作了,尽管当我的应用程序是 LSUIElement 时,无法进入首选项窗口来更改设置,以便人们可以将其设为普通应用程序,这是因为它从来不在菜单栏中,它总是有另一个应用程序的名称。我如何让它显示菜单栏,以便人们实际上可以将应用程序更改回普通应用程序?例如。 snapplr.com/93mm 该应用程序是它被选中的底角的窗口,但它仍将 Finder 显示为选定的应用程序。还有什么奇怪的,因为我输入了这个代码,当应用程序打开时我不能输入'a'。 是的,我明白了。在 TransformProcessType 之后添加这段代码...它可以工作 ;) // 切换到 Dock.app [[NSWorkspace sharedWorkspace] launchAppWithBundleIdentifier:@"com.apple.dock" options:NSWorkspaceLaunchDefault additionalEventParamDescriptor:nil launchIdentifier:nil]; // 切换回 [[NSApplication sharedApplication] activateIgnoringOtherApps:TRUE];【参考方案3】:

(发布这个作为答案,因为 cmets 没有代码格式)

QSBApplicationDelegate.m:223-228

BOOL iconInDock = [[NSUserDefaults standardUserDefaults] boolForKey:kQSBIconInDockKey];
if (iconInDock) 
  ProcessSerialNumber psn =  0, kCurrentProcess ;
  TransformProcessType(&psn, kProcessTransformToForegroundApplication);

【讨论】:

因此,如果我将该代码放入我的 App Delegate 并将一个复选框连接到用户默认控制器。它会起作用吗? 感谢您的帮助,刚刚尝试输入代码,但出现了很多错误。这是一张图片snapplr.com/jckq。 您需要包含正确的标头(查看 TransformProcessType 的文档),使用您自己的首选项而不是 QSB 项目中的常量,并使您的应用成为其 plist 中的 LSUIElement。 如何使应用成为 plist 中的 LSUIElement? @Joshua "kQSBIconInDock" 是 QSB 项目定义的常量,您还没有导入定义 TransformProcessType 的标头。简而言之,您没有阅读@smorgan 的评论。 =)【参考方案4】:

您希望将您的应用程序设置为 LSUIElement,然后使用 TransformProcessType 启用 Dock 图标。需要重新启动应用程序才能使更改生效。有关示例,请参见 Google Quick Search Box 项目。

【讨论】:

啊,我明白了,谢谢,您认为您可以在答案中添加一些代码吗,因为我查看了 google 项目,但是文件太多,我看不到它们实际上是什么高清完成。 QSBApplicationDelegate.m 第 223 - 228 行。他们将首选项本身连接到 NSShardDefaultsController。他们按照我提到的方式将应用程序变成了 Dock 应用程序。【参考方案5】:

将您的应用程序设置为 LSUIElement,然后调用:

[NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];

在发射时。

这也适用于 MAS。

【讨论】:

以上是关于制作一个复选框来打开和关闭 Dock 图标的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Dock 中堆叠打开的文档(文本编辑)文件图标? [关闭]

Xamarin.Mac:关闭的窗口未重新打开以单击 Dock 中的应用程序图标

如何在dock(Mac)中恢复图标? [关闭]

001-mac使用桌面Dock键盘程序安装

切换并重新切换点击类以制作漂亮的复选框

Drupal 6 Views:通过复选框打开/关闭过滤器?