Beispiel #1
0
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;
}
Beispiel #2
0
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;
}