-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:
просто собирается использовать это, чтобы отправить его.
Если вы хотите разрешить щелчки в строке меню, вам следует либо изменить размер окна, чтобы оно не перекрывало строку меню, либо установить уровень окна позади панели меню.