Получить MacOS типа клавиатуры и обнаружить встроенный, на экране или USB - PullRequest
0 голосов
/ 29 января 2019

Я разрабатываю приложение для определения типа клавиатуры для macOS.Я видел несколько функций, которые при чтении документации должны возвращать идентификатор клавиатуры.

Однако, когда я тестирую их на своем ноутбуке, он всегда печатает 59.

Может кто-нибудь сказать мне, откуда берется это значение 59 и его значение ??

Пока что япопробовал с экранной клавиатурой и встроенной клавиатурой.Я также пробовал с разными макетами, но получаю 59

Это мой код:

- (CGEventRef)processEvent:(CGEventRef)cgEvent
{
   uint32_t kbdType = LMGetKbdType();
   NSLog(@"Testing LMGetKbdType  ----------> %d", kbdType);
   NSEvent* event = [NSEvent eventWithCGEvent:cgEvent];

   NSEventType type = [event type];
   if(type==NSKeyDown || type==NSKeyUp) {
      int64_t val = CGEventGetIntegerValueField(cgEvent, kCGKeyboardEventKeyboardType);
      NSLog(@"CGEventGetIntegerValueField: %lld",val);
      EventRef ce = (EventRef)[event eventRef];

      if(ce) {
         unsigned kbt;
         GetEventParameter(
                        ce,
                        kEventParamKeyboardType,
                        typeUInt32, NULL,
                        sizeof kbt, NULL,
                        & kbt
                        );

         NSLog(@"CARBON Keyboard type: %d",kbt);
      }

      CGEventSourceRef evSrc = CGEventCreateSourceFromEvent( cgEvent );

      if(evSrc) {
         unsigned kbt = (NSUInteger) CGEventSourceGetKeyboardType( evSrc );
         CFRelease(evSrc);
         NSLog(@"COCOA: %d",kbt);
      }
   }
}

1 Ответ

0 голосов
/ 30 января 2019

Я думаю, что это недокументированные значения без внешнего значения.Они полезны только для передачи обратно в другие API, которым требуется тип клавиатуры (например, UCKeyTranslate()).

I считают , что они того же типа, что были документированы в <CoreServices/CarbonCore/Gestalt.h>, под gestaltKeyboardType.Однако этот заголовок больше не обновляется и не содержит тип 59.

Что именно вы пытаетесь выяснить в клавиатуре?Если это общий формат, вы можете использовать KBGetLayoutType(), чтобы узнать, является ли он ANSI, JIS или ISO.Вы передаете тип клавиатуры, подобный тому, который вы получаете от LMGetKbdType().

Активная раскладка клавиатуры (например, США против Франции или Дворжака) не должна влиять на тип клавиатуры.Тип клавиатуры является аспектом аппаратного обеспечения и не изменяется при изменении раскладки (интерпретация клавиш в символах).

...