El encabezado CGSPrivate.h que está flotando no es directamente compatible con OS X 10.8 en el sentido de que CGSGetWindowProperty() ya no existe (bueno, sí, pero ya no puede vincularlo). Por lo que añadir estas dos líneas al archivo CGSPrivate.h - Me adelanté y cuenta de esto a mí mismo después de muchas horas de búsqueda en Google - para conseguir que funcione:
extern CGSConnection CGSDefaultConnectionForThread(void);
extern CGError CGSCopyWindowProperty(const CGSConnection cid, NSInteger wid, CFStringRef key, CFStringRef *output);
Adaptación de código de Outis, aquí está una manera de iterar a través de cada título de ventana. He probado esto con el sonido metálico de 4,2 león de montaña:
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);
}
algunas otras cosas que descubrí incluye lo siguiente:
- Sin título de la ventana supera 127 bytes.
- nombres de ventanas están codificados con kCFStringEncodingMacRoman
Por lo tanto, si quieres como un C-secuencia, escribir algo como esto:
char *cTitle[127] = {0};
CFStringGetCString(titleValue,cTitle,127,kCFStringEncodingMacRoman);
Personalmente, le recomiendo hacerlo de esta manera, ya la API de accesibilidad es un dolor total y requiere permisos adicionales.
Espero que esto ayude a alguien! ¡Aclamaciones!
Tenga en cuenta que AppleScript está utilizando las interfaces de accesibilidad, que son públicas y tienen C equivalentes (consulte http://developer.apple.com/mac/library/documentation/Accessibility/Reference/AccessibilityLowlevel/). Las API CGS * no solo no están documentadas, sino que pueden cambiar en cualquier momento. (Por lo tanto, utilícelos solo si está dispuesto a probar temprano y con frecuencia en nuevas versiones del sistema operativo y no tiene otra opción). –
¿Tiene un ejemplo de uso para la API de accesibilidad? Tenía la esperanza de incluirlo, pero no estoy lo suficientemente familiar como para proporcionar cómo usarlo. – outis
Además, requiere que la accesibilidad esté habilitada. – outis