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 IOHIDEventSystemClientScheduleWithRunLoop + 168
0x32f8fd1e:ldr r1、[r4、#96]
0x32f8fd20:cbz r1、0x32f8fd2a; IOHIDEventSystemClientScheduleWithRunLoop + 38
0x32f8fd22:mov r0、r10
..。

IOHIDFamilyを間違った方法で使用しましたか?

4

1 に答える 1

1

投稿されたコードには、少なくとも2つの問題があります。

まず、あなたは電話しています

CFRunLoopRun();

viewDidLoadメイン/UIスレッドで呼び出されるメソッド内。その理由はわかりませんので、その行を削除してください。通常、バックグラウンドスレッドで実行しているメソッドがあり、バックグラウンド実行ループを開始する必要がある場合は、その呼び出しが表示されると思います。または、この回答のようにmain()、で直接コールバックに登録している場合。

次に、これがあります:

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

2行目は

IOHIDEventSystemClientScheduleWithRunLoop(ioHIDEventSystem, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

system変数が実際に何を指しているのかわかりませんが、正しく見えません。

IOKitを正しく使用しているように見えるので、この最近の回答を見てください。

于 2013-03-26T09:36:54.817 に答える