Как установить внешнее приложение, всегда лидирующее в 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*/
}
Есть ли способы достичь двух аспектов, которые я упомянул выше? Или есть какие-то предложения по настройке внешнего приложения, которое всегда будет на первом месте?