Получить заголовок текущего активного окна / документа в Mac OS X - PullRequest
16 голосов
/ 26 января 2009

Обращаясь к ранее заданному вопросу , я хотел бы знать, как получить заголовок текущего активного документа.

Я попробовал упомянуть сценарий в ответах на вопрос выше. Это работает, но только дает мне название приложения. Например, я пишу этот вопрос: когда я запускаю скрипт, он дает мне имя приложения, то есть «Firefox». Это довольно аккуратно, но не очень помогает. Я бы предпочел зафиксировать название моего текущего активного документа. Смотрите изображение.

Название Firefox http://img.skitch.com/20090126-nq2egknhjr928d1s74i9xixckf.jpg

Я использую Leopard, поэтому обратной совместимости не требуется. Также я использую Python Appkit для получения доступа к классу NSWorkspace, но если вы скажете мне код Objective-C, я могу выяснить перевод на Python.


Хорошо, у меня есть решение, которое не очень удовлетворяет, поэтому я не отмечаю ответ Коэна Бока. По крайней мере, пока.
tell application "System Events"
set frontApp to name of first application process whose frontmost is true
end tell
tell application frontApp
if the (count of windows) is not 0 then
    set window_name to name of front window
end if
end tell

Сохранить как скрипт и вызвать его с помощью osascript из оболочки.

Ответы [ 2 ]

7 голосов
/ 26 января 2009

Насколько я знаю, ваш лучший выбор - завернуть AppleScript. Но AppleScript для меня волшебство, поэтому я оставляю его в качестве упражнения для спрашивающего :-)

Это может немного помочь: Сценарий изменения размера передних двух окон для заполнения экрана - Mac OS X Советы

2 голосов
/ 04 мая 2014

В Objective-C краткий ответ с использованием небольшого количества какао и в основном Carbon Accessibility API :

// Get the process ID of the frontmost application.
NSRunningApplication* app = [[NSWorkspace sharedWorkspace]
                              frontmostApplication];
pid_t pid = [app processIdentifier];

// See if we have accessibility permissions, and if not, prompt the user to
// visit System Preferences.
NSDictionary *options = @{(id)kAXTrustedCheckOptionPrompt: @YES};
Boolean appHasPermission = AXIsProcessTrustedWithOptions(
                             (__bridge CFDictionaryRef)options);
if (!appHasPermission) {
   return; // we don't have accessibility permissions

// Get the accessibility element corresponding to the frontmost application.
AXUIElementRef appElem = AXUIElementCreateApplication(pid);
if (!appElem) {
  return;
}

// Get the accessibility element corresponding to the frontmost window
// of the frontmost application.
AXUIElementRef window = NULL;
if (AXUIElementCopyAttributeValue(appElem, 
      kAXFocusedWindowAttribute, (CFTypeRef*)&window) != kAXErrorSuccess) {
  CFRelease(appElem);
  return;
}

// Finally, get the title of the frontmost window.
CFStringRef title = NULL;
AXError result = AXUIElementCopyAttributeValue(window, kAXTitleAttribute,
                   (CFTypeRef*)&title);

// At this point, we don't need window and appElem anymore.
CFRelease(window);
CFRelease(appElem);

if (result != kAXErrorSuccess) {
  // Failed to get the window title.
  return;
}

// Success! Now, do something with the title, e.g. copy it somewhere.

// Once we're done with the title, release it.
CFRelease(title);

В качестве альтернативы может быть проще использовать CGWindow API, как указано в этом ответе StackOverflow .

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