如何在Swift/Cocoa应用程序中获取HID设备列表?

5
以下代码可完美获取连接的HID设备列表:
import Foundation
import IOKit
import IOKit.usb
import IOKit.hid

private func createDeviceMatchingDictionary( usagePage: Int, usage: Int) -> CFMutableDictionary {
    let dict = [
        kIOHIDDeviceUsageKey: usage,
        kIOHIDDeviceUsagePageKey: usagePage
        ] as NSDictionary

    return dict.mutableCopy() as! NSMutableDictionary;
}

let manager = IOHIDManagerCreate(kCFAllocatorDefault, IOOptionBits(kIOHIDOptionsTypeNone));
let keyboard = createDeviceMatchingDictionary(usagePage: kHIDPage_GenericDesktop, usage: kHIDUsage_GD_Keyboard)

IOHIDManagerOpen(manager, IOOptionBits(kIOHIDOptionsTypeNone) )
IOHIDManagerSetDeviceMatching(manager, keyboard)

let devices = IOHIDManagerCopyDevices(manager)

if (devices != nil) {
    print("Found devices!")
}
else {
    print("Did not find any devices :(")
}

如果我将相同的代码放在Cocoa应用程序中的applicationDidFinishLaunching中,则devicesnil

如何在Cocoa应用程序中获取设备列表?

为什么IOHIDManagerCopyDevices()仅在在Cocoa应用程序中运行时返回空值?我错过了什么吗?


我该如何更改代码以便检测USB或串口设备? - Starwave
你从哪里得到这段完美运行的代码的? - Marco Luglio
@MarcoLuglio 这是我几年前正在开发的一个项目,可以在这里找到:https://github.com/chaimpeck/CoolerMaster-NumLock-Toggle - chaimp
请参见此处:https://github.com/chaimpeck/CoolerMaster-NumLock-Toggle/blob/645bf5f14b33e1563b9648a2e5cd82a7b5ec5974/CoolerMasterNumLockToggle/setleds.c#L186 - chaimp
2个回答

7

AHA!

在XCode项目中包含一个名为.entitlements的文件,您需要为com.apple.security.device.usb添加一行并将其设置为“YES”,适用于Cocoa项目。


我刚刚添加了这个,但是它并没有解决我的问题。你有什么想法可能是什么问题?我使用的是Catalina 10.15.2和Xcode 11.2.1。 - Alyoshak

1
在项目目标中,“App Sandbox”部分,勾选“硬件”中的“USB”:

Menu as described above


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