-SendEvent работает не так, как ожидалось

У меня есть полноэкранное прозрачное окно, которое отображается над главным меню моего приложения. Она имеет ignoresMouseEvents установить на NO. Тем не менее, чтобы получать щелчки мыши, я добавил этот код:

[NSEvent addLocalMonitorForEventsMatchingMask:NSLeftMouseDownMask handler:^(NSEvent *event) {
    [self click:event];
    return event;
}];

Каждый раз, когда пользователь нажимает, когда мое приложение активно, метод click таким образом называется:

- (BOOL)click:(NSEvent *)event {
    NSPoint coordinate = [event locationInWindow];
    float ycoord = coordinate.y;
    float menuheight = [[NSApp mainMenu] menuBarHeight];
    float windowheight = [[NSApp mainWindow] frame].size.height;
    if (ycoord >= windowheight - menuheight && ![[NSApp mainWindow] ignoresMouseEvents]) {
        [[NSApp mainWindow] setIgnoresMouseEvents:YES];
        [NSApp sendEvent:event];
        NSLog(@"click");
        [[NSApp mainWindow] setIgnoresMouseEvents:NO];
        return YES;
    }
    return NO;
}

Как видите, это меняет ignoresMouseEvents свойство главного окна в YES, если щелчок был в строке главного меню - после чего он вызывает sendEvent: в NSApplication, Наконец это меняет ignoresMouseEvents Свойство главного окна возвращается к NO.

Тем не менее, даже если журнал нажимает кнопку "щелчок" при щелчке по главной строке меню, щелчок не имеет никакого эффекта. Например, если я щелкну пункт меню (например, пункт меню "Файл"), он не откроет соответствующее меню (в данном случае меню файлов).

Что я делаю неправильно?

1 ответ

Решение

Окно, на которое нацелено событие, определяется оконным сервером еще до того, как ваше приложение его получит. Это не решено во время звонка -sendEvent:, Основной эффект -setIgnoresMouseEvents: должен сообщить оконному серверу, а не внутренностям Какао, как отправлять события мыши.

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

Обратите внимание, например, что NSEvent уже имеет связанный -window до вашего звонка -sendEvent:, -sendEvent: просто собирается использовать это, чтобы отправить его.

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

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