用于辅助键盘的 OSX HID 过滤器?

Posted

技术标签:

【中文标题】用于辅助键盘的 OSX HID 过滤器?【英文标题】:OSX HID Filter for Secondary Keyboard? 【发布时间】:2012-01-30 08:38:16 【问题描述】:

我想过滤第二个键盘上的键盘输入,并防止第二个键盘的键事件到达操作系统(自己处理它们)。如何做到这一点?

【问题讨论】:

【参考方案1】:

这可以通过使用 IOKit 和 HIDManager 类来完成。

如果需要独占访问键盘,可以使用kIOHIDOptionsTypeSeizeDevice 选项,但程序必须以root 权限运行。

获得此结果所需的代码存根如下所示:

// Create a manager instance
IOHIDManagerRef manager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDManagerOptionNone);

if (CFGetTypeID(manager) != IOHIDManagerGetTypeID()) 
    exit(1);


// Setup device filtering using IOHIDManagerSetDeviceMatching
//matchingdict = ...
IOHIDManagerSetDeviceMatching(manager, matchingdict);

// Setup callbacks
IOHIDManagerRegisterDeviceMatchingCallback(manager, Handle_DeviceMatchingCallback, null);
IOHIDManagerRegisterDeviceRemovalCallback(manager, Handle_RemovalCallback, null);
IOHIDManagerRegisterInputValueCallback(manager, Handle_InputCallback, null);

// Open the manager and schedule it with the run loop
IOHIDManagerOpen(manager, kIOHIDOptionsTypeSeizeDevice);
IOHIDManagerScheduleWithRunLoop(manager, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode);

// Start the run loop
//...

更多详细信息可在此处的 Apple 文档中找到:http://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html

我用于我的应用程序的完整代码可以在这里找到: https://gist.github.com/3783042

【讨论】:

非常感谢!我不知道怎么做,但我没有收到有关此问题已回答的通知。我很高兴终于知道如何做到这一点。我试用了你的示例代码,它就像一个魅力。【参考方案2】:

我将对此进行尝试,但由于没有编写自己的驱动程序,因此您无法拦截缓冲区。这是为了防止键盘记录程序和其他恶意程序。一切都必须通过操作系统。

【讨论】:

错误:您可以使用用户级 HID 接口和 kIOHIDOptionsTypeSeizeDevice 来获得对设备的独占访问权限,而无需 kext。如果您不需要独占访问权限,则程序甚至不必以 root 权限运行。 我错了,你应该发帖作为答案,但在自我教育中我发现它确实只需要对键盘进行 root 访问 你是对的,但仅限于独家访问,正如我已经在我的评论中所写的那样;)

以上是关于用于辅助键盘的 OSX HID 过滤器?的主要内容,如果未能解决你的问题,请参考以下文章

HID上层过滤驱动怎么主动将数据发送给系统

用于 OSX 的鼠标 DirectInput

求救!!usb hid设备(模拟键盘)遇到的问题

使用 OSX ASL 过滤事件

OS X 上是不是有 coredump_filter 用于核心转储

OsX 中 USB HID API 的回调永远不会被游戏手柄或其他任何东西调用