Как установить внешнее приложение, всегда лидирующее в OS X?

Я пытаюсь запустить встроенный calculator.app на моем Mac(что означает, что он является внешним по отношению к моему приложению) в моем приложении и вынуждает калькулятор оставаться постоянно впереди на экране.

Вот мой процесс. Во-первых, я запускаю калькулятор и временно помещаю его на передний план.

if ([[NSWorkspace sharedWorkspace] respondsToSelector:@selector(launchApplicationAtURL:options:configuration:error:)])
[[NSWorkspace sharedWorkspace] launchApplicationAtURL:[NSURL fileURLWithPath:@"/Applications/Calculator.app/Contents/MacOS/Calculator" isDirectory:NO]
                                              options:NSWorkspaceLaunchDefault
                                        configuration:nil
                                                error:NULL];

После этого я узнаю калькулятор по имени владельца и пытаюсь закрепить Calculator.app на первом месте. Я застрял здесь. То, что я хотел бы сделать, это либо эти два способа:

1. Установите атрибут, чтобы поместить его всегда впереди. (Не удается найти подходящий атрибут, только найденные атрибуты для изменения размера или положения)

2. Получите NSWindow из калькулятора и установите уровень на передний план. (Кажется нежизнеспособным: как конвертировать Carbon AXUIElementRef в Cocoa NSWindow)

Но похоже, что они оба не доступны.

CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
NSArray *arr = CFBridgingRelease(windowList);
    for (NSMutableDictionary *entry in arr){
        NSString *ownerName = [entry objectForKey:(id)kCGWindowOwnerName];
        if([ownerName isEqualToString:@"Calculator"]){
            pid_t pid = [[entry objectForKey:(id)kCGWindowOwnerPID] intValue];
            AXUIElementRef appRef = AXUIElementCreateApplication(pid);
            CFArrayRef windowList;
            AXUIElementCopyAttributeValue(appRef, kAXWindowsAttribute, (CFTypeRef *)&windowList);
            AXUIElementRef windowRef = (AXUIElementRef) CFArrayGetValueAtIndex( windowList, 0);
            CFTypeRef role;
            AXUIElementCopyAttributeValue(windowRef, kAXRoleAttribute, (CFTypeRef *)&role);

            /*Would like to get the window of the application or assign some attribute to set Calculator frontmost*/
        }

Есть ли способы достичь двух аспектов, которые я упомянул выше? Или есть какие-то предложения по настройке внешнего приложения, которое всегда будет на первом месте?

0 ответов

Другие вопросы по тегам