Mac OS X - USB HID - 如何添加接收设备和移除设备的回调函数?

5
我是一位在Mac OS X编程方面的初学者。我正在遵循这个教程。现在,我手头有这个程序:
#include <stdio.h>
#include <IOKit/hid/IOHIDManager.h>
#include <IOKit/hid/IOHIDKeys.h>
#include <CoreFoundation/CoreFoundation.h>

static void Handle_DeviceMatchingCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef)
{
    puts("YAY Handle_DeviceMatchingCallback");
}

static void Handle_DeviceRemovalCallback(void *inContext, IOReturn inResult, void *inSender, IOHIDDeviceRef inIOHIDDeviceRef)
{
    puts("YAY Handle_DeviceRemovalCallback");
}

int main()
{
    IOHIDManagerRef HIDManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone);
    IOHIDManagerSetDeviceMatching(HIDManager, NULL);

    IOHIDManagerRegisterDeviceMatchingCallback(HIDManager, &Handle_DeviceMatchingCallback, NULL);
    IOHIDManagerRegisterDeviceRemovalCallback(HIDManager, &Handle_DeviceRemovalCallback, NULL);

    IOHIDManagerScheduleWithRunLoop(HIDManager, CFRunLoopGetMain(), kCFRunLoopDefaultMode);

    IOReturn IOReturn = IOHIDManagerOpen(HIDManager, kIOHIDOptionsTypeNone);
    if(IOReturn) puts("IOHIDManagerOpen failed.");

    while(1)
    {
        puts("sleeping...");
        sleep(1);
    }

    return 0;
}

我做错了什么,因为当我插入或移除任何HID设备时,我没有收到回调。


(说明:HID即Human Interface Device,人机接口设备)

1个回答

1

IOHIDManagerScheduleWithRunLoop被钩住到运行循环(Run Loop)中,所以您需要启动一个运行循环。使用while循环不是解决方案。因此为了获得回调,您应该将while循环替换为CFRunLoopRun()调用。

有关运行循环的更多信息,请参见documentation


请问如何在程序使用完毕后跳出循环?我已经尝试了以下代码: CFRunLoopRun(); CFRunLoopRef run_loop = CFRunLoopGetCurrent(); 当我想要退出时,我调用: CFRunLoopStop(run_loop); 但是run_loop为空。 - user4417141
你需要在回调函数中调用这段代码,因为该方法不会立即返回。所以你可以为一个事件(定时器等)创建新的回调函数并在其中调用 CFRunLoopStop(),或者从 RunLoop 中移除所有源和定时器来使其停止。 - Mateusz Szlosek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接