addGlobalMonitorForEventsMatchingMask только возвращает позицию мыши - PullRequest
5 голосов
/ 16 января 2011

Я пытаюсь научиться кодировать для Mac. Некоторое время я работал в Java, поэтому надеюсь, что проблема, с которой я столкнулся, заключается в простом недоразумении с Какао.

У меня есть следующий код:

-(IBAction)beginEventMonitor:(id)sender {
  _eventMonitor = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseUpMask)
  handler:^(NSEvent *incomingEvent) {
    //NSWindow *targetWindowForEvent = [incomingEvent window];
    NSLog(@"Got a mouse click event at %@", NSStringFromPoint([incomingEvent locationInWindow]));
    }];
}

-(IBAction)stopEventMonitor:(id)sender {
  if (_eventMonitor) {
    [NSEvent removeMonitor:_eventMonitor];
    _eventMonitor = nil;
  }
}

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

Разве я не смогу получить больше информации? Я неправильно настраиваю монитор? Мне бы очень хотелось узнать, в каком окне щелкнули, но я даже не могу найти способ превратить местоположение мыши или windowId во что-то полезное.

1 Ответ

6 голосов
/ 16 января 2011

Более подробную информацию об окне можно получить с помощью API CGWindow (новинка в Leopard), например:

CGWindowID windowID = (CGWindowID)[incomingEvent windowNumber];
CFArrayRef a = CFArrayCreate(NULL, (void *)&windowID, 1, NULL);
NSArray *windowInfos = (NSArray *)CGWindowListCreateDescriptionFromArray(a);
CFRelease(a);
if ([windowInfos count] > 0) {
    NSDictionary *windowInfo = [windowInfos objectAtIndex:0];
    NSLog(@"Name:  %@", [windowInfo objectForKey:(NSString *)kCGWindowName]);
    NSLog(@"Owner: %@", [windowInfo objectForKey:(NSString *)kCGWindowOwnerName]);
    //etc.
}
[windowInfos release];

Там много информации (посмотрите в CGWindow.h или обратитесь к документации для получения доступных ключей). Есть также функции для создания скриншотов только одного окна (которое даже работает, если оно частично закрыто другим окном), классные вещи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...