Как прочитать домашнюю клавишу на клавиатуре iOS с помощью IOHIDManager или Bluetooth? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь использовать клавишу home на клавиатуре iOS для клавиши Esc. Я могу использовать IOHIDManager для чтения клавиш на клавиатуре, за исключением домашней клавиши iOS.

Насколько я понимаю, передача NULL в IOHIDManagerSetDeviceMatching должна соответствовать всем типам в IOHIDUsageTables , как показано ниже:

// clang -framework coreFoundation -framework IOKit ./HID.c -o hid
// sudo ./hid

#include <IOKit/hid/IOHIDManager.h>
#include <IOKit/hid/IOHIDValue.h>

void myHIDKeyboardCallback(void* context, IOReturn result, void* sender, IOHIDValueRef value)
{
    IOHIDElementRef elem = IOHIDValueGetElement(value);
    uint32_t scancode = IOHIDElementGetUsage(elem);
    long pressed = IOHIDValueGetIntegerValue(value);
    printf("scancode: %d, pressed: %ld\n", scancode, pressed);
}

int main(void)
{
    IOHIDManagerRef hidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
    IOHIDManagerSetDeviceMatching(hidManager, NULL);
    IOHIDManagerRegisterInputValueCallback(hidManager, myHIDKeyboardCallback, NULL);
    IOHIDManagerScheduleWithRunLoop(hidManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);
    IOHIDManagerOpen(hidManager, kIOHIDOptionsTypeNone);
    CFRunLoopRun();
}

Использование PacketLogger.app (от Apple Hardware IO Tools) Я могу записать следующее, где первое нажатие клавиши - это клавиша home, а затем нажатие клавиши тильды.

[Jan 16 18:31:06.631]  [HII receive]  HID Interrupt: [A1] Unknown [03] Event Data [ 01 00 00 ]
[Jan 16 18:31:06.730]  [HII receive]  HID Interrupt: [A1] Unknown [03] Event Data [ 00 00 00 ]
[Jan 16 18:31:07.805]  [HII receive]  HID Interrupt: [A1] Keyboard [01] Event Data [ 00 00 35 00 00 00 00 00 ]
[Jan 16 18:31:07.905]  [HII receive]  HID Interrupt: [A1] Keyboard [01] Event Data [ 00 00 00 00 00 00 00 00 ]

Возможно, из-за события Unknown он недоступен через IOHIDManager.

Создание расширения ядра и чтение напрямую с Bluetooth также может быть вариантом, вот расширенное ведение журнала сверху:

[Jan 16 18:31:06.631]  [HII receive]  HID Interrupt: [A1] Unknown [03] Event Data [ 01 00 00 ]
               HID Interrupt: [A1] Unknown [03] Event Data [ 01 00 00 ]
[Jan 16 18:31:06.631]  [L2CAP RECEIVE]  Channel ID: 0x0041  Length: 0x0005 (05) [ A1 03 01 00 00 ]
               Channel ID: 0x0041  Length: 0x0005 (05) [ A1 03 01 00 00 ]
               00000000: 0500 4100 a103 0100 00                   ..A......
[Jan 16 18:31:06.631]  [ACL RECEIVE]  Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x0009 (9)]
               Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x0009 (9)]
               Packet Boundary Flags: [10] 0x02 - First packet of Higher Layer Message (i.e. start of an L2CAP packet)
               Broadcast Flags: [00] 0x00 - Point-to-point
               Data (0x0009 bytes)
[Jan 16 18:31:06.631]  [ACL RECEIVE]  00000000: 0b20 0900 0500 4100 a103 0100 00         . ....A......
               00000000: 0b20 0900 0500 4100 a103 0100 00         . ....A......
[Jan 16 18:31:06.730]  [HII receive]  HID Interrupt: [A1] Unknown [03] Event Data [ 00 00 00 ]
               HID Interrupt: [A1] Unknown [03] Event Data [ 00 00 00 ]
[Jan 16 18:31:06.730]  [L2CAP RECEIVE]  Channel ID: 0x0041  Length: 0x0005 (05) [ A1 03 00 00 00 ]
               Channel ID: 0x0041  Length: 0x0005 (05) [ A1 03 00 00 00 ]
               00000000: 0500 4100 a103 0000 00                   ..A......
[Jan 16 18:31:06.730]  [ACL RECEIVE]  Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x0009 (9)]
               Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x0009 (9)]
               Packet Boundary Flags: [10] 0x02 - First packet of Higher Layer Message (i.e. start of an L2CAP packet)
               Broadcast Flags: [00] 0x00 - Point-to-point
               Data (0x0009 bytes)
[Jan 16 18:31:06.730]  [ACL RECEIVE]  00000000: 0b20 0900 0500 4100 a103 0000 00         . ....A......
               00000000: 0b20 0900 0500 4100 a103 0000 00         . ....A......
[Jan 16 18:31:07.805]  [HII receive]  HID Interrupt: [A1] Keyboard [01] Event Data [ 00 00 35 00 00 00 00 00 ]
               HID Interrupt: [A1] Keyboard [01] Event Data [ 00 00 35 00 00 00 00 00 ]
               Modifier keys 00
                        NUM_LOCK    [FALSE]
                        CAPS_LOCK   [FALSE]
                        SCROLL_LOCK [FALSE]
                        COMPOSE     [FALSE]
                        KANA        [FALSE]
               Reserved      00
               Keycode 1 35 Keycode 2 00 Keycode 3 00 Keycode 4 00 Keycode 5 00 Keycode 6 00 
[Jan 16 18:31:07.805]  [L2CAP RECEIVE]  Channel ID: 0x0041  Length: 0x000A (10) [ A1 01 00 00 35 00 00 00 00 00 ]
               Channel ID: 0x0041  Length: 0x000A (10) [ A1 01 00 00 35 00 00 00 00 00 ]
               00000000: 0a00 4100 a101 0000 3500 0000 0000       ..A.....5.....
[Jan 16 18:31:07.805]  [ACL RECEIVE]  Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x000E (14)]
               Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x000E (14)]
               Packet Boundary Flags: [10] 0x02 - First packet of Higher Layer Message (i.e. start of an L2CAP packet)
               Broadcast Flags: [00] 0x00 - Point-to-point
               Data (0x000e bytes)
[Jan 16 18:31:07.805]  [ACL RECEIVE]  00000000: 0b20 0e00 0a00 4100 a101 0000 3500 0000  . ....A.....5...
               00000000: 0b20 0e00 0a00 4100 a101 0000 3500 0000  . ....A.....5...
               00000010: 0000                                     ..
[Jan 16 18:31:07.905]  [HII receive]  HID Interrupt: [A1] Keyboard [01] Event Data [ 00 00 00 00 00 00 00 00 ]
               HID Interrupt: [A1] Keyboard [01] Event Data [ 00 00 00 00 00 00 00 00 ]
               Modifier keys 00
                        NUM_LOCK    [FALSE]
                        CAPS_LOCK   [FALSE]
                        SCROLL_LOCK [FALSE]
                        COMPOSE     [FALSE]
                        KANA        [FALSE]
               Reserved      00
               Keycode 1 00 Keycode 2 00 Keycode 3 00 Keycode 4 00 Keycode 5 00 Keycode 6 00 
[Jan 16 18:31:07.905]  [L2CAP RECEIVE]  Channel ID: 0x0041  Length: 0x000A (10) [ A1 01 00 00 00 00 00 00 00 00 ]
               Channel ID: 0x0041  Length: 0x000A (10) [ A1 01 00 00 00 00 00 00 00 00 ]
               00000000: 0a00 4100 a101 0000 0000 0000 0000       ..A...........
[Jan 16 18:31:07.905]  [ACL RECEIVE]  Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x000E (14)]
               Data [Handle: 0x000B, Packet Boundary Flags: 0x2, Length: 0x000E (14)]
               Packet Boundary Flags: [10] 0x02 - First packet of Higher Layer Message (i.e. start of an L2CAP packet)
               Broadcast Flags: [00] 0x00 - Point-to-point
               Data (0x000e bytes)
[Jan 16 18:31:07.905]  [ACL RECEIVE]  00000000: 0b20 0e00 0a00 4100 a101 0000 0000 0000  . ....A.........
               00000000: 0b20 0e00 0a00 4100 a101 0000 0000 0000  . ....A.........
               00000010: 0000                                     ..

1 Ответ

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

Оказывается Карабинер захватил контроль над вводом и отбросил ключ home, который по иронии судьбы я установил, пытаясь переназначить ключ home для выхода. Удаление программы решило проблему.

...