如何在OS X上始终将外部应用程序设置为最前端?

时间:2016-11-16 10:55:03

标签: objective-c macos cocoa accessibility macos-carbon

我正在尝试在我的应用程序中启动我的Mac上的内置calculator.app(这意味着它在我的应用程序外部)并强制计算器永久保留在屏幕上。

这是我的流程。首先,我启动计算器并将其暂时放在最前面。

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并将级别设置为最前面。 (似乎不可行:How to convert a Carbon AXUIElementRef to 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 个答案:

没有答案