Как мне получить подробную информацию о приложении, используя Objective-C? - PullRequest
2 голосов
/ 18 ноября 2009

У меня есть следующий код для определения текущего окна. Как я могу получить 1) внутреннее имя приложения, 2) местоположение, 3) издателя и 4) описание окна / приложения?

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//Get info about the currently active application.
NSWorkspace* workspace            = [NSWorkspace sharedWorkspace];
NSDictionary* currentAppInfo      = [workspace activeApplication];

//Get the PSN of the current application.
UInt32 lowLong                    = [[currentAppInfo objectForKey:@"NSApplicationProcessSerialNumberLow"] longValue];
UInt32 highLong                   = [[currentAppInfo objectForKey:@"NSApplicationProcessSerialNumberHigh"] longValue];
ProcessSerialNumber currentAppPSN = {highLong,lowLong};

//Grab window information from the window server.
CFArrayRef windowList             = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
ProcessSerialNumber myPSN         = {kNoProcess, kNoProcess};

//Loop through the windows, the window list is ordered from front to back.
for (NSMutableDictionary* entry in (NSArray*) windowList)
{
    int pid = [[entry objectForKey:(id)kCGWindowOwnerPID] intValue];
    GetProcessForPID(pid, &myPSN);

    //If the process of the current window in the list matches our process, get the front window number.
    if(myPSN.lowLongOfPSN == currentAppPSN.lowLongOfPSN && myPSN.highLongOfPSN == currentAppPSN.highLongOfPSN)
    {
        NSNumber *windowNumber    = [entry objectForKey:(id)kCGWindowNumber];
        windowNumber = [entry objectForKey:(id)kCGWindowNumber];
        NSString* applicationName = [entry objectForKey:(id)kCGWindowOwnerName];
        NSLog(@"Capture the window: %@ with window ID: %@.",applicationName,windowNumber);
        return applicationName;

        //Break because we only want the front window.
        break;
    }
}
CFRelease(windowList);
[pool release];

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

Вы должны использовать функцию ProcessInformationCopyDictionary из API-интерфейса Process Manager. Дайте &myPSN и kProcessDictionaryIncludeAllInformationMask в качестве аргументов, и вы получите информацию, которую вы ищете.

0 голосов
/ 13 апреля 2010

Я искал что-то связанное с этой темой. Мне нужен WindowRef окна или части окна в определенном месте (положение мыши), и он должен быть над всеми окнами всех запущенных приложений ...

Я попробовал это с Carbon («Так как мое приложение полностью написано на C ++), но я обнаружил, что некоторые функции Carbon не работают должным образом (MacFindWindow, FindWindow, HIWindowFindAtLocation, FindWindowOfClass, HIWindowGetCGWindowID ...)

Может быть, я делаю это неправильно, Трудно поверить, что эти функции Carbon больше не будут работать в 64-битных архитектурах ...

Итак, в связи с вашим вопросом я нашел тот же код и попробовал это, но это не то, что мне нужно, я надеюсь, что это поможет вам в любом случае, и я буду продолжать искать и пытаться, пока не получу его (если ОС может сделать это каждый должен).

//if the process of the current window in the list matches our process, get the front window number
    if(myPSN.lowLongOfPSN == currentAppPSN.lowLongOfPSN && myPSN.highLongOfPSN == currentAppPSN.highLongOfPSN)
    {
        NSNumber* windowNumber    = [entry objectForKey:(id)kCGWindowNumber];
        NSString* applicationName = [entry objectForKey:(id)kCGWindowOwnerName];
        NSLog(@"The current app is %@ and the window number of its front window is %@.",applicationName,windowNumber);
        CGRect bounds;
        CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)[entry objectForKey:(id)kCGWindowBounds], &bounds);
        NSLog(@"WINDOW RECT BOUNDS; (x,y,width, height) = (%d,%d, %d, %d)", bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height);


        break;
    }

Также, перейдите по этой ссылке, я вам не помогу. Я уверен:

http://code.google.com/p/blazingstars/source/browse/trunk/PokerHK/HKLowLevel.m?r=70

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...