我正在尝试在我的应用程序中启动我的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*/
}
有没有办法实现我上面提到的两个方面?或者有任何关于设置外部应用程序总是最重要的建议吗?