如何检测USB键盘是不是插入和拔出

Posted

技术标签:

【中文标题】如何检测USB键盘是不是插入和拔出【英文标题】:How to detect if USB keyboard is plugged and unplugged如何检测USB键盘是否插入和拔出 【发布时间】:2011-05-12 14:34:27 【问题描述】:

当 USB 键盘从电脑上插拔时,是否有任何守护程序/工具会触发某些信号/事件? 我需要在我的程序中知道何时插入和拔出 USB 键盘。关于如何做到这一点的任何想法?

【问题讨论】:

【参考方案1】:

udev(Linux 设备管理器)是轮询硬件的一种。当它检测到有关设备的一些变化时,它会执行相关的规则。

您应该向 udev 添加一条规则,以便通知您的程序插入移除 USB 键盘。您可以找到有关 udev 规则 here 的文档,或查看 /etc/udev/rules.d//lib/udev/rules.d/ 中的文件以找到许多示例。

【讨论】:

监视硬件变化这样简单的事情不必那么难,也不必需要root权限。请参阅下面如何使用 DBus 和 HAL 执行此操作的答案。【参考方案2】:

udevadm monitor(udev 管理二进制文件)或udev_monitor(在 libudev 中)。

或者,如果您在 X11 中运行输入热插拔,您可以侦听 XI 扩展事件 DevicePresenceNotify

【讨论】:

【参考方案3】:

如果 HAL 守护程序正在运行(对于大多数现代 Linux 桌面来说都是如此),您可以收听其 DBus 信号。这是一个如何检测是否插入 USB 鼠标的示例(我手头没有 USB 键盘):

import gobject
import dbus
from dbus.mainloop.glib import DBusGMainLoop

DBusGMainLoop(set_as_default=True)
bus = dbus.SystemBus()
# enumerate all present mice:
manager = dbus.Interface(bus.get_object("org.freedesktop.Hal",
                                        "/org/freedesktop/Hal/Manager"),
                         "org.freedesktop.Hal.Manager")
mice = set(manager.FindDeviceByCapability('input.mouse'))

def device_added(sender):
    dev = dbus.Interface(bus.get_object("org.freedesktop.Hal", sender),
                         "org.freedesktop.Hal.Device")
    try:
        caps = dev.GetProperty('info.capabilities')
        if 'input.mouse' in caps:
            print "mouse plugged in"
            mice.add(sender)
    except dbus.DBusException:
        pass

def device_removed(sender):
    if sender in mice:
        print "mouse unplugged"
        mice.remove(sender)

bus.add_signal_receiver(device_added, signal_name="DeviceAdded")
bus.add_signal_receiver(device_removed, signal_name="DeviceRemoved")

loop = gobject.MainLoop()
loop.run()

【讨论】:

HAL 已被弃用一年多。 实际上 HAL 已被弃用,不再支持 udev;只有过时的应用程序使用它。但是,我同意您的解决方案比我的更简单,并且不需要 root 访问权限。不知道是否可以使用未弃用的工具做类似的事情,但应该避免使用 HAL。 HAL 可能已被弃用,但它的替代 DeviceKit 在某些方面非常差。引用 X.Org Wiki,“DeviceKit 和 udisks/upower/etc. 替代品都没有为输入设备提供任何此功能,并且 DeviceKit 作者已表示他们不打算提供此类功能,建议直接使用操作系统取而代之的是libudev之类的接口。”我会继续为这些功能使用 HAL,因为它仍然包含在大多数发行版中。 Fedora HAL Removal、Debian HALectomy、Ubuntu Halsectomy 等。HAL 要么已从默认安装中删除,要么即将删除。 是的,我知道这一事实。但仍然:a) 商业支持的 linux 发行版继续使用 HAL,b) 没有完整的用户级替代品。不是真的,root 权限只是为了获取有关插入/拔出 USB 键盘或鼠标的通知?

以上是关于如何检测USB键盘是不是插入和拔出的主要内容,如果未能解决你的问题,请参考以下文章

linux环境下,Qt怎么检测USB的插入和拔出

我可以使用 win32 Setup API 来检测 USB 设备何时插入或拔出吗?

关于检测usb设备的问题

请问Linux内核里,USB键盘和鼠标的驱动都是哪些文件?

如何检测 iPad 上是不是存在外接键盘?

如何使用python检测USB设备是不是插入?