Заставить приложение OSX реагировать на первый щелчок мышью, когда оно не сфокусировано - PullRequest
12 голосов
/ 24 сентября 2008

Нормальные приложения OSX съедают первый щелчок мыши, когда не сфокусированы, чтобы сначала сфокусировать приложение. Затем будущие клики обрабатываются приложением. Кнопка воспроизведения / паузы iTunes и Finder ведут себя по-разному, первый щелчок срабатывает даже тогда, когда он не сфокусирован. Я ищу способ заставить существующее приложение (Remote Desktop Connection.app) действовать по первому щелчку, а не только по фокусу.

Ответы [ 3 ]

14 голосов
/ 24 сентября 2008

Проверьте NSView AcceptFirstMouse, это может быть то, что вы ищете.

acceptsFirstMouse: Переопределяется подклассами, чтобы вернуть YES, если получателю нужно отправить mouseDown: сообщение для начального события мыши, NO если нет.

  • (BOOL) acceptFirstMouse: (NSEvent *) theEvent

Параметры событие Начальное событие нажатия мыши, которое должно быть над получателем в его окне.

Обсуждение Получатель может либо вернуть значение безоговорочно, либо использовать местоположение события, чтобы определить, хочет ли он событие. Реализация по умолчанию игнорирует событие и возвращает NO.

Переопределите этот метод в подклассе, чтобы экземпляры могли реагировать на переходы. Это позволяет пользователю нажимать на представление в неактивном окне, активируя представление одним щелчком мыши, вместо того, чтобы сначала щелкнуть, чтобы сделать окно активным, а затем щелкнуть представление. Большинство объектов просмотра отклоняют попытку перехода по клику, поэтому событие просто активирует окно. Однако многие объекты управления, такие как экземпляры NSButton и NSSlider, принимают их, поэтому пользователь может немедленно управлять элементом управления, не отпуская кнопку мыши.

4 голосов
/ 24 сентября 2008

Реакция на первый щелчок мышью, когда он не сфокусирован, называется «щелчком мыши». И его ценность горячо обсуждается, например, здесь и здесь .

0 голосов
/ 07 февраля 2015

// Предполагается, что у вас есть 1 контроллер вида, который всегда висит вокруг. За рулем LoadView. Нотабене это не сработает до йосемити.

- (void)loadView {
    NSLog(@"loadView");


    self.view = [[NSView alloc] initWithFrame:
                 [[app.window contentView] frame]];
    [self.view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];

    int opts = (NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways);
    trackingArea0 = [[NSTrackingArea alloc] initWithRect:self.view.bounds
                                                 options:opts
                                                   owner:self
                                                userInfo:nil];
    [self.view addTrackingArea:trackingArea0];


}
- (void)mouseEntered:(NSEvent *)theEvent {
    NSLog(@"entered");


        if ([[NSApplication sharedApplication] respondsToSelector:@selector(activateIgnoringOtherApps:)]) {
            [[NSApplication sharedApplication] activateIgnoringOtherApps:YES];
        }

}
...