我正在尝试在我的应用程序中获取触摸事件。所以我使用 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(系统, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
IOKit`IOHIDEventSystemClientScheduleWithRunLoop:
...
0x32f8fd14: cmp.w r10, #0
0x32f8fd18:strd r10,r11,[r4,#116] 0x32f8fd1c:beq 0x32f8fdac; IOHIDEventSystemClientScheduleWithRunLoop + 168
0x32f8fd1e:ldr r1,[r4,#96]
0x32f8fd20:cbz r1,0x32f8fd2a; IOHIDEventSystemClientScheduleWithRunLoop + 38
0x32f8fd22:mov r0,r10
...
我是否以错误的方式使用 IOHIDFamily?
我在发布的代码中至少看到几个问题:
首先,您正在调用
CFRunLoopRun();
in the viewDidLoad
方法,该方法将在主/UI 线程上调用。我认为没有理由这样做,所以只需删除该行即可。如果您有一个在后台线程上运行的方法,并且需要启动后台运行循环,我通常希望看到该调用。或者,如果您直接在中注册回调main()
, 正如在这个答案中 https://stackoverflow.com/a/15118510/119114.
然后,你有这个:
void *ioHIDEventSystem = IOHIDEventSystemClientCreate(kCFAllocatorDefault);
IOHIDEventSystemClientScheduleWithRunLoop(system, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
我猜第二行应该是
IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);
我不知道是什么system
变量实际上指的是,但看起来不对。
Take a 看看这个最近的答案 https://stackoverflow.com/a/15550916/119114,因为它似乎使用IOKit正确。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)