Заголовок CGSPrivate.h, который плавает вокруг, не совместим напрямую с OS X 10.8, так как CGSGetWindowProperty () больше не существует (ну, он есть, но вы больше не можете ссылаться на него). Итак, добавьте эти две строки в файл CGSPrivate.h - я решил сам и после многих часов поиска в Google - выяснил, как это работает:
extern CGSConnection CGSDefaultConnectionForThread(void);
extern CGError CGSCopyWindowProperty(const CGSConnection cid, NSInteger wid, CFStringRef key, CFStringRef *output);
Адаптируя код outis, вот способ перебора каждого заголовка окна. Я проверил это с помощью clang 4.2 на Mountain Lion:
CFStringRef titleValue;
CGSConnection connection = CGSDefaultConnectionForThread();
NSInteger windowCount, *windows;
NSCountWindows(&windowCount);
windows = (NSInteger*) malloc(windowCount * sizeof(NSInteger));
if (windows) {
NSWindowList(windowCount, windows);
for (int i = 0; i < windowCount; ++i)
{
CGSCopyWindowProperty(connection, windows[i], CFSTR("kCGSWindowTitle"), &titleValue);
if(!titleValue) //Not every window has a title
continue;
//Do something with titleValue here
}
free(windows);
}
Некоторые другие вещи, которые я обнаружил, включают следующее:
- Ни один заголовок окна не превышает 127 байт.
- Заголовки окон кодируются с помощью kCFStringEncodingMacRoman
Итак, если вы хотите, чтобы это была C-строка, напишите что-то вроде этого:
char *cTitle[127] = {0};
CFStringGetCString(titleValue,cTitle,127,kCFStringEncodingMacRoman);
Лично я бы порекомендовал сделать это таким образом, поскольку API-интерфейс Accessibility представляет собой сложную задачу и требует дополнительных разрешений.
Надеюсь, это кому-нибудь поможет! Ура!