NSTrackingArea не полностью работает, когда нет ключевого окна

Сначала немного контекста. По сути, у меня есть окно, которое закрывает рабочий стол. На нем у меня есть несколько представлений WebKit WebView, которые позволяют взаимодействие с пользователем. По умолчанию, как и следовало ожидать, когда другое приложение активно, оно не получает эти события (такие как зависание, ввод мыши и щелчок). Я могу заставить его работать, сначала щелкнув мое окно, а затем двигая мышь, но это не очень удобно для удобства использования. Мне также удалось заставить его активировать окно при входе курсора, но это далеко от идеала и довольно хакерское.

Поэтому вместо этого я пытаюсь использовать область отслеживания. На данный момент на суперпредставлении WebViews у меня есть эта область отслеживания:

NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self visibleRect]
                                                                options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways
                                                                owner:self
                                                                userInfo:nil];

Это работает так, как я хочу, я получаю все события мыши. Тем не менее, кажется, что WebViews не отвечают как задумано. События перемещения мышью в JavaScript запускаются, только когда я удерживаю и перетаскиваю, а не просто парю и тащу

Я попытался использовать hitTest, чтобы получить правильное представление, но, похоже, ничего не работает. Вот пример метода, я использую логическое значение isHandlingMouse, потому что без него казалось, что по какой-то причине бесконечный цикл создается:

- (NSView *)handleTrackedMouseEvent: (NSEvent *)theEvent{
    if(isHandlingMouse)
        return nil;
    isHandlingMouse = true;
    NSView *hit = [self hitTest: theEvent.locationInWindow];
    if (hit && hit != self) {
        return hit;
    }
    return nil;
}

- (void)mouseMoved:(NSEvent *)theEvent{
    NSView *hit = [self handleTrackedMouseEvent: theEvent];
    if (hit){
        [hit mouseMoved: theEvent];
    }
    isHandlingMouse = false;
}

Представление "попадание" - это WebHTMLView, который выглядит как закрытый класс. Кажется, что все должно работать, но, возможно, я что-то делаю, что нарушаю его, или я неправильно отправляю событие в WebHTMLView.

1 ответ

Опубликуйте пример проекта Xcode, чтобы людям было проще тестировать решения этой проблемы.

Я делал что-то подобное, и потребовалось много проб и ошибок, чтобы найти решение. Скорее всего, вам нужно будет создать подкласс NSWindow и добавить - (BOOL)canBecomeKeyWindow { return YES; }затем, когда вы обнаружите, что мышь находится над окном, вы можете вызвать [window orderFrontRegardless] просто так он может правильно захватывать события мыши.

Другие вопросы по тегам