制作一个复选框来打开和关闭 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 中堆叠打开的文档(文本编辑)文件图标? [关闭]