Как я могу использовать API Доступности Какао, чтобы обнаружить, что окно переносится на передний план?

Ваш компонент должен реагировать на изменения в базовых данных. Таким образом, вы можете сделать что-то вроде этого:

getSchedules(emps) {
 return emps.map(employee => <SomeEmployeeRenderingComponent emp={employee} /> );
}
render() {
  return (
   <div>{this.getSchedules(this.props.employees).bind(this)}</div>
  )
}

и mapstatetoprops становится:

function mapStateToProps(state) {

  const rota = {
   id: null,
   date: moment(),
   notes: null,
   events: [null, null, null, null, null, null, null],
   published: null,
   employees: state.firestore.ordered.employees
  };

  return rota
}
13
задан Steve McLeod 7 December 2008 в 08:51
поделиться

3 ответа

Я не мог подписаться на текущие изменения окна, но можно попросить у доступности API текущего приложения и текущих приложений большая часть активного окна.

Предположите, что у Вас есть класс под названием CurrentAppData со следующими данными:

@interface CurrentAppData : NSObject {
    NSString* _title;
    AXUIElementRef _systemWide;
    AXUIElementRef _app;
    AXUIElementRef _window;
}

Код для нахождения текущего применения выглядит примерно так:

-(void) updateCurrentApplication {
   // get the currently active application  
   _app = (AXUIElementRef)[CurrentAppData
                           valueOfExistingAttribute:kAXFocusedApplicationAttribute 
                                        ofUIElement:_systemWide];

   // Get the window that has focus for this application
   _window = (AXUIElementRef)[CurrentAppData 
                              valueOfExistingAttribute:kAXFocusedWindowAttribute 
                                           ofUIElement:_app];

   NSString* appName = [CurrentAppData descriptionOfValue:_window
                                             beingVerbose:TRUE];    

   [self setTitle:appName];
}

В этом примере _systemWide переменная инициализируется в классах init функция как: _system = AXUIElementCreateSystemWide ();

Функция класса valueOfExistingAttribute похожа на это:

// -------------------------------------------------------------------------------
//  valueOfExistingAttribute:attribute:element
//
//  Given a uiElement and its attribute, return the value of an accessibility
//  object's attribute.
// -------------------------------------------------------------------------------
+ (id)valueOfExistingAttribute:(CFStringRef)attribute ofUIElement:(AXUIElementRef)element
{
    id result = nil;
    NSArray *attrNames;

    if (AXUIElementCopyAttributeNames(element, (CFArrayRef *)&attrNames) == kAXErrorSuccess) 
    {
        if ( [attrNames indexOfObject:(NSString *)attribute] != NSNotFound
                &&
            AXUIElementCopyAttributeValue(element, attribute, (CFTypeRef *)&result) == kAXErrorSuccess
        ) 
        {
            [result autorelease];
        }
        [attrNames release];
    }
    return result;
}

Предыдущая функция была взята от примера Apple UIElementInspector, который является также большим ресурсом для приобретения знаний о Доступности API.

8
ответ дан 1 December 2019 в 23:32
поделиться

В Mac OS X приложения и окна являются абсолютно отдельными вещами с приложениями, содержащими окна; они не formerly-the-same-thing как в Microsoft Windows. Необходимо обнаружить активацию и деактивацию каждого приложения.

Вы сделаете это путем наблюдения для kAXApplicationActivatedNotification и kAXApplicationDeactivatedNotification. Объект этих уведомлений является приложением, активируемым и деактивированным. Необходимо будет также обнаружить запуск приложений и выход; можно сделать это использование Диспетчера процессов или NSWorkspace. Оба из тех API могут дать Вам идентификатор процесса, который можно использовать для создания объекта AXApplication.

5
ответ дан 1 December 2019 в 23:32
поделиться

Что относительно NSAccessibilityFocusedUIElementChangedNotification?

2
ответ дан 1 December 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: