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]
просто так он может правильно захватывать события мыши.