Objective c 获取以前最前端的应用程序

Objective c 获取以前最前端的应用程序,objective-c,cocoa,swift,Objective C,Cocoa,Swift,好吧,我被难住了。我正在编写一个小实用程序,它需要在程序启动之前知道最前面的应用程序是什么。我试过这个: var thePreviousApp:NSRunningApplication = NSWorkspace.sharedWorkspace().frontmostApplication override func awakeFromNib() { thePreviousApp = NSWorkspace.sharedWorkspace().frontmostApplication

好吧,我被难住了。我正在编写一个小实用程序,它需要在程序启动之前知道最前面的应用程序是什么。我试过这个:

var thePreviousApp:NSRunningApplication = NSWorkspace.sharedWorkspace().frontmostApplication

override func awakeFromNib()
{
    thePreviousApp = NSWorkspace.sharedWorkspace().frontmostApplication
}
当我从Xcode运行时(即,它将前一个应用程序设置为“Xcode”),它会工作,但当我从Finder或Launchpad运行二进制文件时,它会返回我的程序名,而不是程序启动前最前面的程序名

不管它值多少钱,我都可以通过将其放入AppDelegate中来获得上一个应用程序:

var thePreviousApp:NSRunningApplication = NSWorkspace.sharedWorkspace().frontmostApplication

 func applicationDidResignActive(notification: NSNotification!)
 {
    thePreviousApp = NSWorkspace.sharedWorkspace().frontmostApplication
 }
如果我启动程序,然后点击command tab以激活上一个程序,然后再次点击command tab以激活我的程序,则前一个应用程序就是正确的应用程序

我还尝试获取运行应用程序的数组,然后遍历它们以检查哪个程序处于“活动”状态。同样,没有骰子。同样的问题

如有任何建议,将不胜感激

谢谢,
Tom

我不知道您为什么要这样做,但我能想到的唯一方法是使用NSWorkspace通知(NSWorkspaceDidDeactivateApplicationNotification)

您必须将其中一个对象注册为该通知上的观察者,然后使用该通知对象获取已停用的应用程序


使用您的代码,您总是可以获得您的应用程序,因为当发出ApplicationIDResignative通知时,frontmostApplication()不会在完全相同的时间更新。

我不知道您为什么要这样做,但我能想到的唯一方法是使用NSWorkspace通知(NSWorkspaceDidDeactivateApplicationNotification)

您必须将其中一个对象注册为该通知上的观察者,然后使用该通知对象获取已停用的应用程序


使用您的代码,您总是可以获得您的应用程序,因为当发出ApplicationIDResignative通知时,frontmostApplication()不会在完全相同的时间更新。

我不知道您为什么要这样做,但我能想到的唯一方法是使用NSWorkspace通知(NSWorkspaceDidDeactivateApplicationNotification)

您必须将其中一个对象注册为该通知上的观察者,然后使用该通知对象获取已停用的应用程序


使用您的代码,您总是可以获得您的应用程序,因为当发出ApplicationIDResignative通知时,frontmostApplication()不会在完全相同的时间更新。

我不知道您为什么要这样做,但我能想到的唯一方法是使用NSWorkspace通知(NSWorkspaceDidDeactivateApplicationNotification)

您必须将其中一个对象注册为该通知上的观察者,然后使用该通知对象获取已停用的应用程序


使用您的代码,您总是可以获得您的应用程序,因为当发出ApplicationIDResignative通知时,frontmostApplication()不会在完全相同的时刻更新。

对于那些想知道的人,这就是我最后做的。我在AppDelegate中创建了一个名为PreviousApp的属性。然后创建了一个observer对象:

import Foundation
import Cocoa

class theObserver: NSObject
{
    override init() {
        super.init()
        NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: "setPreviousApplication:", name: NSWorkspaceDidDeactivateApplicationNotification, object: nil)
    }

    func setPreviousApplication(notification: NSNotification!)
    {
        let theAppDelegate:AppDelegate=NSApplication.sharedApplication().delegate as AppDelegate
        theAppDelegate.thePreviousApp = notification.userInfo[NSWorkspaceApplicationKey] as NSRunningApplication
    }
}
此对象在AppDelegate中实例化

感谢斯特里科先生的帮助


Tom

对于那些想知道的人,这就是我最后做的。我在AppDelegate中创建了一个名为PreviousApp的属性。然后创建了一个observer对象:

import Foundation
import Cocoa

class theObserver: NSObject
{
    override init() {
        super.init()
        NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: "setPreviousApplication:", name: NSWorkspaceDidDeactivateApplicationNotification, object: nil)
    }

    func setPreviousApplication(notification: NSNotification!)
    {
        let theAppDelegate:AppDelegate=NSApplication.sharedApplication().delegate as AppDelegate
        theAppDelegate.thePreviousApp = notification.userInfo[NSWorkspaceApplicationKey] as NSRunningApplication
    }
}
此对象在AppDelegate中实例化

感谢斯特里科先生的帮助


Tom

对于那些想知道的人,这就是我最后做的。我在AppDelegate中创建了一个名为PreviousApp的属性。然后创建了一个observer对象:

import Foundation
import Cocoa

class theObserver: NSObject
{
    override init() {
        super.init()
        NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: "setPreviousApplication:", name: NSWorkspaceDidDeactivateApplicationNotification, object: nil)
    }

    func setPreviousApplication(notification: NSNotification!)
    {
        let theAppDelegate:AppDelegate=NSApplication.sharedApplication().delegate as AppDelegate
        theAppDelegate.thePreviousApp = notification.userInfo[NSWorkspaceApplicationKey] as NSRunningApplication
    }
}
此对象在AppDelegate中实例化

感谢斯特里科先生的帮助


Tom

对于那些想知道的人,这就是我最后做的。我在AppDelegate中创建了一个名为PreviousApp的属性。然后创建了一个observer对象:

import Foundation
import Cocoa

class theObserver: NSObject
{
    override init() {
        super.init()
        NSWorkspace.sharedWorkspace().notificationCenter.addObserver(self, selector: "setPreviousApplication:", name: NSWorkspaceDidDeactivateApplicationNotification, object: nil)
    }

    func setPreviousApplication(notification: NSNotification!)
    {
        let theAppDelegate:AppDelegate=NSApplication.sharedApplication().delegate as AppDelegate
        theAppDelegate.thePreviousApp = notification.userInfo[NSWorkspaceApplicationKey] as NSRunningApplication
    }
}
此对象在AppDelegate中实例化

感谢斯特里科先生的帮助


Tom

我想,一个想法是阅读最近使用的windows列表。
至少zposition应该是有序的,因为应用程序总是排在前面(从前面订购)。
所以你的“最后一个”应用应该在列表旁边

您可以从窗口列表中选择第二个程序,因为您的程序现在位于堆栈顶部。
如果启动时没有gui,例如隐藏所有窗口,则最后一个应用程序可能仍然位于堆栈顶部。
CGWindowListCopyWindowInfo为您提供所有正在运行的应用程序的列表,甚至包括通知中心、桌面图像和菜单栏等隐藏的应用程序


更新:正在运行的应用程序列表是以某种随机顺序排列的,而不是以zPositions的顺序排列的,因此这个想法不起作用。

我想,一个想法是阅读最近使用的windows列表。
至少zposition应该是有序的,因为应用程序总是排在前面(从前面订购)。
所以你的“最后一个”应用应该在列表旁边

您可以从窗口列表中选择第二个程序,因为您的程序现在位于堆栈顶部。
如果启动时没有gui,例如隐藏所有窗口,则最后一个应用程序可能仍然位于堆栈顶部。
CGWindowListCopyWindowInfo为您提供所有正在运行的应用程序的列表,甚至包括通知中心、桌面图像和菜单栏等隐藏的应用程序


更新:正在运行的应用程序列表是以某种随机顺序排列的,而不是以zPositions的顺序排列的,因此这个想法不起作用。

我想,一个想法是阅读最近使用的windows列表。
至少zposition应该是有序的,因为应用程序总是排在前面(从前面订购)。
所以你的“最后一个”应用应该在列表旁边

你会选择