CGWindowID CGWindowWithInfo(AXUIElementRef window, CGPoint location) { AXError error; pid_t pid; error = AXUIElementGetPid(window, &pid); if (error != kAXErrorSuccess) return kCGNullWindowID; CFStringRef title = NULL; error = AXUIElementGetTitle(window, &title); CGRect frame; error = AXUIElementGetFrame(window, &frame); if (error != kAXErrorSuccess) return kCGNullWindowID; CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID); if (windowList == NULL) return kCGNullWindowID; CGWindowID windowID = kCGNullWindowID; for (CFIndex i = 0; i < CFArrayGetCount(windowList); i++) { CFDictionaryRef window = CFArrayGetValueAtIndex(windowList, i); int windowPID; CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowOwnerPID), kCFNumberIntType, &windowPID); if (windowPID != pid) continue; CGRect windowBounds; CGRectMakeWithDictionaryRepresentation(CFDictionaryGetValue(window, kCGWindowBounds), &windowBounds); if (!CGSizeEqualToSize(frame.size, windowBounds.size)) continue; if (!CGRectContainsPoint(windowBounds, location)) continue; CFStringRef windowName = CFDictionaryGetValue(window, kCGWindowName); if (windowName == NULL || title == NULL || CFStringCompare(windowName, title, 0) == kCFCompareEqualTo) { CFNumberGetValue(CFDictionaryGetValue(window, kCGWindowNumber), kCGWindowIDCFNumberType, &windowID); break; } } CFRelease(windowList); return windowID; }
ax_application *AXLibGetFocusedApplication() { local_persist AXUIElementRef SystemWideElement = AXUIElementCreateSystemWide(); AXUIElementRef Ref = (AXUIElementRef) AXLibGetWindowProperty(SystemWideElement, kAXFocusedApplicationAttribute); if(Ref) { pid_t PID; AXUIElementGetPid(Ref, &PID); CFRelease(Ref); if(AXLibIsApplicationCached(PID)) return &(*AXApplications)[PID]; } return NULL; }