macOS: обнаружить все запуска приложений, включая фоновые? - PullRequest
0 голосов
/ 09 октября 2018

Новичок здесь.Я пытаюсь создать небольшой приемник для запуска приложений, и у меня уже есть это:

// 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

Примечание: когда я его создаю, он будет работать нормально, но если вы сделаете это с Xcode 10 на HighСьерра, вы получите ld предупреждений, которые вы можете игнорировать, однако.

Мой вопрос: Есть ли способ также обнаружить запуск фонового приложения Например, приложение панели меню, такое как Вязкость и т. д.?Apple утверждает, что

система не публикует [NSWorkspaceWillLaunchApplicationNotification] для фоновых приложений или для приложений, которые имеют ключ LSUIElement в своем файле Info.plist.Если вы хотите знать, когда все приложения (включая фоновые приложения) запускаются или завершаются, используйте наблюдение значения ключа для отслеживания значения, возвращаемого методом runningApplications.

Здесь: https://developer.apple.com/documentation/appkit/nsworkspacewilllaunchapplicationnotification?language=objc

Я бы хотя бы попытался добавить поддержку фоновых приложений и т. Д. Для слушателя, но я не знаю, как это сделать.Есть идеи?

1 Ответ

0 голосов
/ 11 октября 2018

Как следует из документа, вы используете Наблюдение значения ключа для наблюдения свойства 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#>
    }
}
...