2013-03-10 2 views
2

Прежде чем продолжить, я хотел бы прочитать это сообщение, сказав, что это, возможно, самая хакерская, совершенно злая, противная тема, поэтому я не ожидаю, что ответы будут содержать «юридические "код любым растяжением.Создание CGEvent из целого числа со знаком

При попытке получить доступ к файлу внутренних настроек OS X Mountain Lion использует для включения комбинации горячих клавиш для активации диктовки, я наткнулся на некоторые красиво созданные знаковые целые числа, содержащие коды ключей, определенные в System Preferences.app. Проблема в том, что единственный способ, которым я могу думать о том, чтобы натирать их на CGEvent, - это пройти и в основном разобрать битмаску для данного кода ключа, что является потенциально бесплодным и раздражающим делом. И потому что CGEvent удобно typedef'd для внутренней структуры (__CGEvent), нет никакой возможности увидеть, что это внутренняя организация (другими словами, я не могу выйти из этого malloc()). То, что я получил до сих пор показывают в коде ниже:

/***************************************UNSAFE*****************************************************/ 
//1048584, -1048585 - Two Left CMD presses; 1048576, -1048577 - Two CMD presses; 8388608, -8388609 - Two Fn presses; 1048592, -1048593 - Two Right CMD presses 
- (void)forceDictation { 

    NSString *path = [[NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]stringByAppendingPathComponent:@"Preferences/com.apple.symbolichotkeys.plist"]; 
    NSDictionary *dictationPrefs = [NSDictionary dictionaryWithContentsOfFile:path]; 
    NSDictionary *dictationDict = dictationPrefs[@"AppleSymbolicHotKeys"]; 
    NSDictionary *keyvalueDict = dictationDict[@"164"]; 
    NSDictionary *valueDict = keyvalueDict[@"value"]; 
    NSArray *parameters = valueDict[@"parameters"]; 
    NSInteger firstCode = [[parameters objectAtIndex:0]longLongValue]; 
    NSInteger secondCode = [[parameters objectAtIndex:1]longLongValue]; 
} 

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

+0

Не то, чтобы это проливало свет на что-либо, но между каждой парой чисел 'a' и' b', 'a = ~ b'. При догадках это может быть мерой против подделки: может быть проверка, что 'a^b = ~ 0'. –

ответ

6

Давайте посмотрим на бит-моделей (и вы заметите, что я изменил порядок из порядка, в котором вы перечислили их):

2 × ⌘: 
1048576: 00000000000100000000000000000000 
-1048577: 11111111111011111111111111111111 

2 × left-⌘: 
1048584: 00000000000100000000000000001000 
-1048585: 11111111111011111111111111110111 

2 × right-⌘: 
1048592: 00000000000100000000000000010000 
-1048593: 11111111111011111111111111101111 

2 × Fn: 
8388608: 00000000100000000000000000000000 
-8388609: 11111111011111111111111111111111 

Там не так много я могу сказать от этого, кроме что:

  • Предполагая, что положительное значение является «реальным» один (см мой комментарий к моей теории о том, почему существуют два и почему все четыре пары взаимно дополняют друг друга), идентификатор ключа составляет по меньшей мере 20 бит до (обратите внимание, что в первой паре в моем порядке положительное значение равно точно 2**20), а в le ast 4 бит длиной (2 × Fn - 2**23).
  • Как минимум два из младших пяти бит определяют, какая клавиша (левая или правая), если настройка настолько ограничена. Слева - первый ⌘, а правый - второй. Если эта часть равна нулю, любой из идентифицированного ключа будет соответствовать, например, влево или вправо ⌘.

Но нам, возможно, не нужно разбирать биты.

На моем MacBook Air, работает Key Codes дает мне следующий вывод:

Modifier Change 
    Keys:  ⌘ 
    Key Code: 65535/0xffff 
    Modifiers: 1048848/0x100110 

Modifier Change 
    Keys:  
    Key Code: 65535/0xffff 
    Modifiers: 256/0x100 

Modifier Change 
    Keys:  ⌘ 
    Key Code: 65535/0xffff 
    Modifiers: 1048840/0x100108 

Modifier Change 
    Keys:  
    Key Code: 65535/0xffff 
    Modifiers: 256/0x100 

Modifier Change 
    Keys:  
    Key Code: 65535/0xffff 
    Modifiers: 8388864/0x800100 

Modifier Change 
    Keys:  
    Key Code: 65535/0xffff 
    Modifiers: 256/0x100 

Некоторые из этих чисел выглядят могучей знакомы, не так ли?

  • Каждый раз, когда я нажимаю клавишу ⌘, состояние модификаторов изменяется на что-то в диапазоне 1048000.
  • При нажатии Fn, Модификаторы состояние меняется на 8388864. С уважением был 8388608.

Давайте посмотрим на модифицирующих масок в NSEvent.h:

NSCommandKeyMask   = 1 << 20, 
NSFunctionKeyMask   = 1 << 23, 

О, эй ,

И оба они, и на самом деле все клавиши-модификатора (как мы их знаем) маски, находятся в пределах NSDeviceIndependentModifierFlagsMask:

NSDeviceIndependentModifierFlagsMask = 0xffff0000UL 

Из чего следует, что нижние 16 бит device-зависит от: они могут отличаться от одной машины или одной клавиатуры к другой. Другими словами, ваши младшие 16 бит могут отличаться от моих младших 16 бит.

Но подождите! Есть больше!

Если посмотреть в IOLLEvent.h I Kit/O, мы находим маски, похожие на те, в NSEvent, плюс это:

/* device-dependent (really?) */ 

#define NX_DEVICELCTLKEYMASK 0x00000001 
#define NX_DEVICELSHIFTKEYMASK 0x00000002 
#define NX_DEVICERSHIFTKEYMASK 0x00000004 
#define NX_DEVICELCMDKEYMASK 0x00000008 
#define NX_DEVICERCMDKEYMASK 0x00000010 
#define NX_DEVICELALTKEYMASK 0x00000020 
#define NX_DEVICERALTKEYMASK 0x00000040 
#define NX_DEVICERCTLKEYMASK 0x00002000 

Итак, LCMDKEYMASK является 0b1000 и RCMDKEYMASK является 0b10000. Это также соответствует найденным значениям слева и справа: слева находится NX_COMMANDMASK | NX_DEVICELCMDKEYMASK, а справа - NX_COMMANDMASK | NX_DEVICERCMDKEYMASK.

Из этого я могу сделать вывод, что:

  • Эти цифры не являются целыми CGEvents.
  • В каждой паре положительное значение представляет собой маску флажков-модификаторов, а отрицательное значение - просто ее дополнение.
  • События, которые нужно создать, - это события изменения модификатора (kCGEventFlagsChanged), такие же, как и коды клавиш (для включения этого флажка), с флажками-модификаторами каждого события, как показано выше. (Если вы действительно можете инициировать диктовку, создавая такие события, я не знаю, вам нужно будет убедиться сами.)
  • Битовая компоновка не очень важна, но если вы действительно хотите знать, верхняя половина («независимая от устройства») определяет, какие модификаторы включены, а нижняя половина («зависимая от устройства» и, по-видимому, только присутствует в событии с измененной флагом) определяет, какие клавиши только что были нажаты, чтобы изменить их.
  • Количество прессов для клавишных модификаторов, предположительно, жестко закодировано (или, если нет, указано в другом месте).
+2

Мой, мой, какой ответ. Почему, я думаю, это заслуживает щедрости. Держись на 72 часа дольше, мужик. – CodaFi