macOS:检测所有应用程序启动,包括后台应用程序?

2023-12-31

这里是新手。我正在尝试为应用程序启动创建一个小型侦听器,并且我已经有了:

// almon.m

#import <Cocoa/Cocoa.h>
#import <stdio.h>
#include <signal.h>

@interface almon: NSObject {}
-(id) init;
-(void) launchedApp: (NSNotification*) notification;
@end

@implementation almon
-(id) init {
  NSNotificationCenter * notify
    = [[NSWorkspace sharedWorkspace] notificationCenter];

  [notify addObserver: self
          selector:    @selector(launchedApp:)
          name:        @"NSWorkspaceWillLaunchApplicationNotification"
          object:      nil
  ];
  fprintf(stderr,"Listening...\n");
  [[NSRunLoop currentRunLoop] run];
  fprintf(stderr,"Stopping...\n");
  return self;
}

-(void) launchedApp: (NSNotification*) notification {
  NSDictionary *userInfo = [notification userInfo]; // read full application launch info
  NSString* AppPID = [userInfo objectForKey:@"NSApplicationProcessIdentifier"]; // parse for AppPID
  int killPID = [AppPID intValue]; // define integer from NSString
  kill((killPID), SIGSTOP); // interrupt app launch
  NSString* AppPath = [userInfo objectForKey:@"NSApplicationPath"]; // read application path
  NSString* AppBundleID = [userInfo objectForKey:@"NSApplicationBundleIdentifier"]; // read BundleID
  NSString* AppName = [userInfo objectForKey:@"NSApplicationName"]; // read AppName
  NSLog(@":::%@:::%@:::%@:::%@", AppPID, AppPath, AppBundleID, AppName);
}
@end

int main( int argc, char ** argv) {
  [[almon alloc] init];
  return 0;
}
// build: gcc -Wall almon.m -o almon -lobjc -framework Cocoa
// run: ./almon

注意:当我构建它时,它会运行良好,但如果你在 High Sierra 上使用 Xcode 10 进行构建,你会得到ld但是,您可以忽略警告。

我的问题:有没有办法也检测到启动后台应用程序,例如像粘度等菜单栏应用程序?苹果是这么说的

系统不发帖 [NSWorkspaceWillLaunchApplicationNotification] 用于后台应用程序或 对于具有以下功能的应用程序LSUIElement关键在他们的Info.plist文件。 如果您想知道所有应用程序(包括后台应用程序)何时 启动或终止,使用键值观察来监控值 由返回runningApplications method.

Here: https://developer.apple.com/documentation/appkit/nsworkspacewilllaunchapplicationnotification?language=objc https://developer.apple.com/documentation/appkit/nsworkspacewilllaunchapplicationnotification?language=objc

我至少会尝试向侦听器添加对后台应用程序等的支持,但我不知道如何去做。有任何想法吗?


正如文档所建议的,您可以使用键值观察来观察runningApplications共享工作区对象的属性:

static const void *kMyKVOContext = (void*)&kMyKVOContext;


[[NSWorkspace sharedWorkspace] addObserver:self
                                forKeyPath:@"runningApplications"
                                   options:NSKeyValueObservingOptionNew // maybe | NSKeyValueObservingOptionInitial
                                   context:kMyKVOContext];

然后,您将实现观察方法(使用 Xcode 的现成代码片段):

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
    if (context != kMyKVOContext)
    {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
        return;
    }

    if ([keyPath isEqualToString:@"runningApplications"])
    {
        <#code to be executed when runningApplications has changed#>
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

macOS:检测所有应用程序启动,包括后台应用程序? 的相关文章

随机推荐

  • 如何使用 PHPUnit 测试远程 Postgres 服务器上的数据库交互?

    我正在尝试对我创建的类进行单元测试 但大多数类都处理数据库 我已经在本地测试了非数据库相关的类 但当涉及到使用数据库时 尤其是远程数据库 我感到很困惑 该指南显示使用 PDO 访问本地数据库 该数据库似乎转储到 XML 文件 因此它对我来说
  • 找到颜色范围内最接近的颜色匹配[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有十个十六进制 RGB 颜色值 它们是肤色 我希望能够找到与特定十六进制 RGB 值最接近的匹配 我会以某种方式从起始颜色迭代直到落
  • android Recyclerview Layoutmanager的onLayoutChildren在item内容更改时调用

    我有一个带有自定义布局管理器的回收器视图 它是一个twowayview staggeredgridview布局管理器https github com lucasr twoway view blob master layouts src ma
  • 禁止 XmlSerializer 发出空值类型

    请考虑以下 Amount 值类型属性 该属性被标记为可为 null 的 XmlElement XmlElement IsNullable true public double Amount get set 当可为 null 的值类型设置为
  • 实例变量定义和实例块

    我有以下代码 s Hello String s 这编译得很好 这意味着变量定义在实例块之前执行 但是 如果我使用以下代码 它不会编译 错误 非法前向引用 s Hello String ss s String s 因此 不可能在变量之前的实例
  • setwd() 在当前工作目录中

    我有一个文件夹列表 每个文件夹中都有一个与 R 相同的脚本 必须在文件夹中的文件上运行 我编写了一次脚本并将脚本复制到每个文件夹中 问题是我有大约 100 个文件夹的列表 因此我不可能手动在当前工作目录中 setwd 我想知道是否可以设置当
  • Arm GCC 链接器:如何将数据放在 (rw) 非易失性存储器中的绝对地址处

    我面临以下问题 我正在对 ARM cortex M4 微控制器进行编程 我希望它具有 IP 地址 网络掩码 网关等的默认值 该默认值应该可以通过串行通信进行更改 并且更改应该是持久的 例如 IP 地址和网络掩码的默认值为 192 168 1
  • AngularJS 按下按键时更改多行选择 ng-grid 属性

    我在视图中定义了以下网格 div class gridStyle hide div 我想仅在按下 ctrl 键时才允许多重选择 所以我在控制器中将 multiSelect 属性定义为 false scope resultsOptions d
  • mailto:带附件的链接

    我为我的客户制作了一个应用程序 它提供具有以下示例结构的 zip 文件 index html files file pdf inc style css 基本上 用户将使用名为 Sites 2 Go 的应用程序将 zip 文件传输到他们的 i
  • SQL Server 中什么被视为“大”表?

    我有一个表 其中有 1000 万条记录 这算是很多记录吗 我应该担心搜索时间吗 如果没有 它会继续增长 那又怎样is算一张大桌子吗 表大小对搜索时间的影响有多大 我可以采取哪些措施来改善这些问题 最好是在它们成为问题之前 大 就像 聪明 它
  • v8旧空间和新空间是什么?

    Node js据我所知 有两个参数来控制内存分配 max new space size and max old space size 提到的具体是什么NEW SPACE and OLD SPACE things 在分代垃圾收集器 V8 使用
  • 创建索引视图时如何引用表两次?如果没有它,我可以基于 2 个表和多行强制执行唯一性吗?

    EDIT 添加了我试图禁止的示例数据 这个问题类似于 无法在视图上创建聚集索引 因为我两次引用同一个表 有什么解决方法吗 https stackoverflow com questions 1011595 cannot create a c
  • 具有公共抽象基类的对象的集合

    我有一个名为 generic 的抽象类 实现如下 public abstract class generic public string creatorID get set public string itemID get set publ
  • 用对象的属性来生成函数

    在 PowerShell 中 您可以将多个参数传递给函数或 cmdlet 方法是将它们包装在哈希表变量中 然后传递前缀为该变量 代替 是否可以使用作为另一个对象的属性的哈希表 即作为一个衬垫 进行splat 例如下面我首先必须分配属性 te
  • mediaelement 中的 UWP YouTube 播放器

    我目前正在开发一个 UWP youtube 播放器 但在播放实际视频时遇到了一些大问题 我正在使用它在媒体元素中播放 YouTube 视频 using MyToolkit Multimedia var url await YouTube G
  • 具有依赖项的 CocoaPods 框架 - 在框架模块内包含非模块化标头

    我正在尝试构建一个具有其他 pod 依赖项的私有 CocoaPods 框架 其中 我将 Parse 添加为 podspec 文件中的依赖项 s dependency Parse 然而 当我尝试将其清理干净时 pod lib lint MyP
  • ASP.NET MVC 领域的最佳实践

    我目前正在构建一个 CMS 系统 我需要一种简单的方法来包含或排除组件 我的第一个想法是使用 asp net mvc 区域功能来识别每个组件本身 但从我看来 区域特征有problems https stackoverflow com que
  • 有什么理由不使用 SQLObject 而不是 SQLAlchemy? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我预计不需要比基本 CRUD 类型功能更多的功能 我知道 SQLAlchemy 更灵活 但 sqlobj
  • 重新启动 EC2 实例时会发生什么?

    当我重新启动 EC2 实例时 我是否会再次获取初始映像 或者保留重新启动前的硬盘状态 计费会发生什么情况 该小时是否重新开始 或者我是否继续使用重新启动时所在的小时的一部分 重新启动实例就像重新启动 PC 硬盘不受影响 您不会返回到映像的原
  • macOS:检测所有应用程序启动,包括后台应用程序?

    这里是新手 我正在尝试为应用程序启动创建一个小型侦听器 并且我已经有了 almon m import