如何检测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键盘是不是插入和拔出的主要内容,如果未能解决你的问题,请参考以下文章