Использование CGEventSetIntegerValueField для редактирования события клавиатуры дает ошибку - PullRequest
2 голосов
/ 18 августа 2011

Итак, я задал еще один вопрос здесь:

Как определить разницу между событием с нажатой пользователем клавиатурой и сгенерированным?

Один из ответов, который возник, заключался в использовании поля «нажатия мыши» (маловероятно, что оно будет использоваться для события клавиатуры), чтобы пометить событие как необходимое.

Итак, я пытаюсь:

CGEventSetIntegerValueField(myKeyboardEvent, kCGMouseEventPressure, 0xFEEDFACE);

Проблема:

  1. Я не знаю, что означает 0xFEEDFACE. Что это значение по умолчанию? Что я должен установить это? Как я могу проверить, помечен ли он мной?
  2. Запуск приведенного выше кода выдает ошибку:

<Error>: kCGErrorIllegalArgument: CGEventSetIntegerValueField: invalid event

1 Ответ

2 голосов
/ 25 августа 2011

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

Функция принимает три аргумента: событие, CGEventField (которое является enum) и int64_t (8-байтовое целое число со знаком), чье Диапазон допустимых значений, вероятно, зависит от поля. Я использовал 0xFEEDFACE, чтобы указать, что вы можете попытаться поместить туда произвольное «магическое» значение *, а затем проверить его при получении события, используя CGEventGetIntegerValueField. Если ваше событие получает новое событие с вашим «магическим номером», то оно (почти наверняка) было отправлено вами. В противном случае оно было отправлено системой.

Подводя итоги и отвечая на ваши явные вопросы: этот аргумент не имеет значения по умолчанию; вы должны передать что-то произвольное, что вряд ли будет использоваться системой событий (вы можете проверить серию событий, отправленных системой, чтобы увидеть, как выглядят «реальные» значения); идея заключается в том, что ваше произвольное значение позволяет вам проверить, что событие было отмечено вами.

Что касается ошибки, похоже, я ошибся. Я подумал, что вы можете установить любое поле для любого типа события (например, используя поле «нажатия мыши» на событии клавиатуры, поскольку система почти наверняка не установит это) для передачи произвольной информации (и так определите события, которые вы сами построили). Однако кажется, что Event Services не позволят вам сделать это. Могут быть и другие поля, которые вы можете использовать, но я точно не знаю.


* Я предполагал, что вы поймете, что это мусорная ценность; извините.

...