Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xcode Cocoa-以编程方式转到前台/后台_Xcode_Macos_Cocoa - Fatal编程技术网

Xcode Cocoa-以编程方式转到前台/后台

Xcode Cocoa-以编程方式转到前台/后台,xcode,macos,cocoa,Xcode,Macos,Cocoa,我有一个LSUIElement设置为1的应用程序。它有一个内置编辑器,所以我希望应用程序在编辑器打开时以Cmd+Tab循环显示 -(void)stepIntoForeground { if (NSAppKitVersionNumber < NSAppKitVersionNumber10_7) return; if (counter == 0) { ProcessSerialNumber psn = {0, kCurre

我有一个LSUIElement设置为1的应用程序。它有一个内置编辑器,所以我希望应用程序在编辑器打开时以Cmd+Tab循环显示

    -(void)stepIntoForeground
    {
        if (NSAppKitVersionNumber < NSAppKitVersionNumber10_7) return;
        if (counter == 0) {
            ProcessSerialNumber psn = {0, kCurrentProcess};
            OSStatus osstatus = TransformProcessType(&psn, kProcessTransformToForegroundApplication);
            if (osstatus == 0) {
                ++counter;
            } else {
                //...
            }
        }
    }
    -(void)stepIntoBackground
    {
        if (NSAppKitVersionNumber < NSAppKitVersionNumber10_7) return;
        if (counter == 0) return;

        if (counter == 1) {
            ProcessSerialNumber psn = {0, kCurrentProcess};
            OSStatus osstatus = TransformProcessType(&psn, kProcessTransformToUIElementApplication);
            if (osstatus == 0) {
                --counter;
            } else {
                //..
            }
        }
    }
-(无效)步进前台
{
if(NSAppKitVersionNumber
问题是:

  • 还有一个码头图标(没什么大不了的)
  • 还有菜单,这也没什么大不了的,但它们并不总是出现
有什么方法可以完全禁用菜单或使其始终显示在前台?提前感谢。

您可以在plist文件中将应用程序“应用程序是代理(UIElement)”设置为“是”

编辑:

我认为有一些黑客可以做到这一点。 但事实并非如此。 Cmd+tab用于将应用程序置于前台,但如果您没有菜单栏,它在用户看来就不像前台

我宁愿创建一个菜单栏来访问该应用程序。

这就是我们的做法。 (工程10.7+)

  • 不要在应用程序列表中使用LSBackgroundOnly或LSUIElement
  • 添加并初始化菜单和NSStatusBar菜单
  • 在应用程序初始化但尚未显示任何窗口后,在您可能希望显示第一个窗口(如果有)的位置。我们使用ApplicationIDFinishLaunching

    • 如果您不想在应用程序初始化后显示任何窗口,请使用

      [NSApp设置激活策略:NSApplication激活策略禁止]

      在10.9中,您最终可以使用其他方面非常正确的

      [NSApp设置激活策略:NSApplication激活策略附件]

    • 如果在app init完成后打开任何窗口,那么只需显示主窗口即可

  • 维护您的窗口列表

  • 如果最后一个窗口关闭,请致电

    [NSApp设置激活策略:NSApplication激活策略禁止]

    在10.9中,您最终可以使用其他方面非常正确的

    [NSApp设置激活策略:NSApplication激活策略附件]

  • 下次显示第一个窗口时,请致电

    [NSApp setActivationPolicy:NSApplication ActivationPolicyRegular]
    [NSApp activateIgnoringOtherApps:YES]
    [[self window]MakeKeyandDerfront:nil]

  • 这应该可以做到,如果至少有一个应用程序窗口可见,您的应用程序将具有菜单、带有状态信号的停靠图标和cmd+tab元素,如果最后一个应用程序窗口关闭,只有NSStatusBar元素保持不变

    已知问题:
    • 第一步很重要,因为如果没有这一步,如果系统模式对话框暂停您的启动(例如,您的应用程序从网络下载并被隔离,第一次启动时可能会出现一个确认对话框,具体取决于您的安全设置),则在显示第一个应用程序窗口后,您的菜单栏可能不属于您的应用程序

      解决方法:以普通应用程序启动(步骤1.)可以解决此问题,但会导致另一个小问题,启动时,您的应用程序图标可能会在dock中出现一段时间,即使您希望在不显示任何窗口的情况下启动。(但我们可以解决这个问题,不拥有菜单栏对我们来说是一个更大的问题,所以我们选择了这个)

    • 在NSApplicationActivationPolicyRegular和NSApplicationActivationPolicyAccessory(或以下10.9版操作系统上禁止的NSApplicationActivationPolicy)之间进行更改将终止状态栏菜单元素的工具提示,工具提示最初将显示,但在第二次调用NSApplicationActivationPolicyAccessority->NSApplicationActivationPolicyProbited后将不再显示

      解决方案:我们找不到解决方案,并向苹果报告了一个bug

    • 从NSApplicationActivationPolicyRegular更改为NSApplicationActivationPolicyAccessory在某些操作系统版本上还存在其他问题,例如有时在可见的应用程序窗口中可能不再有鼠标事件

      解决方法:首先切换到NSApplicationActivationPolicy禁止(注意这会导致不需要的应用程序消息,如NSApplicationWillResignActivationify、NSWindowDidResignMain通知等!)

    • 从NSApplicationActivationPolicyAccessory更改为NSApplicationActivationPolicyRegular与某些操作系统版本一样是虚假的

      • 应用程序主菜单被冻结,直到第一个应用程序前端状态更改
      • 此策略后激活的应用程序并不总是放在应用程序订单的前面
      解决方法:首先切换到NSApplicationActivationPolicy禁止,注意最后切换到所需的NSApplicationActivationPolicy应延迟,使用f.e.dispatch\u async或类似方法


    使用swift 4,在应用程序中完成启动(\uU4:通知)


    为我做了这个把戏,但我只是想把键盘焦点放在编程创建的窗口上。谢谢。

    如果你想要码头图标,那么你也可以选择菜单。如果你不想要菜单,你不能有停靠图标。实际上,我只需要Cmd+Tab循环。当我走到前面
    NSApplication.shared.setActivationPolicy(.regular)