1

我正在尝试在我的应用程序中获取触摸事件。所以我使用 IOHIDFamily 回调来获取事件。我的代码是这样的:

void handle_event(void* target, void* refcon, IOHIDServiceRef service, IOHIDEventRef event)
{
    printf("Received event of type %2d from service %p.\n", 
           IOHIDEventGetType(event), service);
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
    IOHIDEventSystemClientScheduleWithRunLoop(system, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
    IOHIDEventSystemClientRegisterEventCallback(system, handle_event, NULL, NULL);
    CFRunLoopRun();
}

执行时出现错误:

IOHIDEventSystemClientScheduleWithRunLoop(system, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

IOKit`IOHIDEventSystemClientScheduleWithRunLoop:
...
0x32f8fd14: cmp.w r10, #0
0x32f8fd18: strd r10, r11, [r4, #116] <---EXC_BAD_ACCESS(code=EXC_ARM_DA_ALIGN)
0x32f8fd1c: beq 0x32f8fdac; IOHIDEventSystemClientScheduleWithRunLoop + 168
0x32f8fd1e:ldr r1,[r4,#96]
0x32f8fd20:cbz r1,0x32f8fd2a;IOHIDEventSystemClientScheduleWithRunLoop + 38
0x32f8fd22: mov r0, r10
...

我是否以错误的方式使用 IOHIDFamily?

4

1 回答 1

1

我在发布的代码中至少看到了几个问题:

首先,你在打电话

CFRunLoopRun();

viewDidLoad方法中,它将在主/UI线程上调用。我认为没有理由,所以只需删除该行。如果您有一个在后台线程上运行的方法,并且您需要启动后台运行循环,我通常希望看到该调用。或者,如果您直接在 中注册回调main()就像在这个答案中一样。

然后,你有这个:

void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
IOHIDEventSystemClientScheduleWithRunLoop(system, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

我猜第二行应该是

IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

我不知道system变量实际指的是什么,但它看起来不正确。

看看这个最近的答案,因为它似乎正确使用了 IOKit

于 2013-03-26T09:36:54.817 回答