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

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

【问题讨论】:

    标签: python linux keyboard dbus


    【解决方案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 RemovalDebian HALectomyUbuntu Halsectomy 等。HAL 要么已从默认安装中删除,要么即将删除。
      • 是的,我知道这一事实。但仍然:a) 商业支持的 linux 发行版继续使用 HAL,b) 没有完整的用户级替代品。不是真的,root 权限只是为了获取有关插入/拔出 USB 键盘或鼠标的通知?
      猜你喜欢
      • 2017-12-16
      • 2017-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多