如何为所有正在运行的应用程序添加侦听器

时间:2018-03-03 15:22:57

标签: swift macos cocoa for-loop nsrunningapplication

我想显示所有正在运行的应用程序名称的列表。

问题:在调用函数后,它不会添加正在运行的应用程序。因此,它不会将应用程序名称添加到列表中 同时进行。

目标:我想添加一个监听器,因此如果新的应用程序正在运行,它将同时将其添加到阵列而无需重新启动应用程序或再次调用该功能。

func allRunningApplications() {

        for runningApplication in NSWorkspace.shared.runningApplications {

            let appName = runningApplication.localizedName

            // Add App Name to Array
            array.append(appName)
    }
}

2 个答案:

答案 0 :(得分:2)

我提到了“确实发布”等。 al。,通知,因为你没有解释为什么你想监视正在运行的应用程序集。

如果您只对特定应用程序是否已启动(或退出)感兴趣,则可能更容易使用NSWorkspace通知:

(未经测试的代码)

let center = NSWorkspace.shared.notificationCenter
center.addObserver(forName: NSWorkspace.didLaunchApplicationNotification,
                    object: nil, // always NSWorkspace
                     queue: OperationQueue.main) { (notification: Notification) in
                        if let app = notification.userInfo?[NSWorkspace.applicationUserInfoKey] as? NSRunningApplication {
                            if app.bundleIdentifier == "com.apple.Terminal" {
                                // User just launched the Terminal app; should we be worried?
                            }
                        }
}

请注意,工作区通知会发布到NSWorkspace的私人通知中心,而不是默认通知中心,因此请记住在那里添加观察者。

答案 1 :(得分:1)

您可以尝试使用NSWorkspace的通知中心。

    self.workspace = [NSWorkspace new];
    NSArray *myObserver;
    myObserver = (NSArray*) [[[NSWorkspace sharedWorkspace] notificationCenter] addObserverForName:  NSWorkspaceWillLaunchApplicationNotification object:nil queue:nil usingBlock:^(NSNotification *note)
                         {
                             if(note)
                             {
                               //do your action
                             }
                         }
                        ];

NSWorkspaceWillLaunchApplicationNotification将通知您是否要启动任何应用程序。