通过轮询设备管理器在设备连接后启动脚本

0 投票
1 回答
755 浏览
提问于 2025-04-18 12:38

我正在写一个脚本,这个脚本会在开机时自动启动(可能是通过一个批处理文件)。这个脚本的目的是检测两台设备是否连接到电脑上(具体来说是Wii手柄和体重板)。这两台设备通过蓝牙与东芝的蓝牙程序配对,同时在设备管理器中也显示为“符合HID标准的游戏控制器”。

当这个脚本检测到Wii手柄和体重板连接后,它会启动一个批处理文件,进而启动GlovePIE(模拟键盘和鼠标)和一个用pygame编写的游戏。游戏和GlovePIE的部分都已经完成了。

现在我遇到的问题是如何检测设备是否成功连接。

我只使用Python,因为这是我熟悉的语言,而且与这个程序相关的其他程序也是用它编写的。如果有人有更好的解决方案,请告诉我。

关于如何检测Wii手柄和体重板是否连接,我有以下想法:

  1. 找出东芝蓝牙程序中指示两个设备成功配对的地方。
  2. 在设备管理器中检查是否有两个符合HID标准的游戏控制器。这个方法假设不会有其他控制器连接,这在我的情况下是成立的。
  3. 欢迎提出其他方法的建议。

我找不到关于东芝程序的太多文档,所以我开始寻找与设备管理器交互的方法。

我找到一个可以与设备管理器交互的Python模块,链接在这里。我能够使用这个模块获取设备管理器中所有设备的列表。这个模块只支持按磁盘、SCSI设备、卷和存储控制器进行分类排序,而不支持人机接口设备。

我把所有设备的列表赋值给一个变量,叫做all_dev。我猜这个是一个列表而不是元组,因为“type(all_dev) is list”返回的是True。而且“len(all_dev)”返回172。

现在的主要问题是:

如果我打印all_dev,它会给出一个很长的列表,格式是“[]”,里面的每个项目用大于/小于符号“<>”包围。如果我选择其中一个项目,比如说,然后在列表中搜索它:

>>>  "<HID-compliant game controller>" in all_dev
False

但是如果我运行:

>>> x = "test"
>>> all_dev.append(x)
>>> "test" in all_dev
True

同样的情况发生在我使用计数函数时,测试时返回1,其他情况返回0。

如果我能找出为什么in函数总是返回False的原因,我应该就能写出脚本的其余部分。

以下是程序的第一部分,只有部分列表输出(长得太多了)。

>>> from infi.devicemanager import DeviceManager
>>> dm = DeviceManager()
>>> all_dev = dm.all_devices
>>> print all_dev
[<USB Root Hub>, <Performance Counters for Windows Driver>, <Generic volume shadow copy>, <Generic volume>, <System speaker>, <VirtualBox Service>, <Generic volume shadow copy>, <KSecPkg>, <Remote Desktop Device Redirector Bus>, <Bluetooth RFHID>, <PEAUTH>, <ViewSonic VX1935wm-5 >, <aswStm>, <Terminal Server Keyboard Driver>, <Extended IO Bus>, <VirtualBox USB Monitor Driver>, <Link-Layer Topology Discovery Mapper I/O Driver>, <Bluetooth HID Port>]

1 个回答

0

这些看起来像是生成器对象,每个设备类别对应一个生成器。

如果你想获取所有的单个设备,可以遍历每个生成器,像这样:

[list(category) for category in all_dev]

这样会给你一个包含每个类别设备的列表的列表。然后你可以在这个列表的列表中查找你想要的设备。你也可以把这个列表压平,检查你想要的设备是否在这个压平后的列表中:

'dev_I_want' in [item for category in all_dev for item in list(category)]

但这假设list(a_category)返回的是一个简单的只包含设备名称的列表——实际上可能会更复杂。

撰写回答