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

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

【问题讨论】:

标签: objective-c cocoa


【解决方案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。

【讨论】:

    猜你喜欢
    • 2018-06-11
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多