【问题标题】:Reading Device Manager's Property Fields in Windows 7/8在 Windows 7/8 中读取设备管理器的属性字段
【发布时间】:2013-02-21 10:42:34
【问题描述】:

我正在开发一个提供字段详细信息的 Windows 应用程序 --> X.

X 在哪里 -->

右击我的电脑>

    Properties >

          Device Manager > (select any Item - Say KeyBoard) >

                   Click it > standard PS/2 KeyBoard >

                                double Click standard PS/2 KeyBoard >

                                           click the Details Tab >

在属性下有各种字段,如显示名称、问题代码、父兄弟姐妹等,等等?

我想得到他们的价值观。 我可以为此使用哪个 Windows API。 我正在为 Windows 7 和 Windows 8 执行此操作。我希望 API 保持不变。另外我有 64 位机器。 对于我想从设备管理器了解其详细信息的任何设备,这必须是正确的。

另外我只想进行所有操作 - 读取和不设置(写入),所以我认为违反管理员权限不会有任何问题。请建议。!我添加了快照供参考!比如说我想知道 HID USB 投诉鼠标的当前状态(D0(活动)或 D2(睡眠))。

我需要获取此电源状态 D0。

【问题讨论】:

    标签: windows c#-4.0 windows-7 device-manager


    【解决方案1】:

    使用ManagementObjectCollection很容易获取硬件信息。

    例如从 PC 处理器获取所有属性和值

    var win32DeviceClassName = "win32_processor";
                var query = string.Format("select * from {0}", win32DeviceClassName);
    
                using (var searcher = new ManagementObjectSearcher(query))
                {
                    ManagementObjectCollection  objectCollection = searcher.Get();
    
                    foreach (ManagementBaseObject managementBaseObject in objectCollection)
                    {
                        foreach (PropertyData propertyData in managementBaseObject.Properties)
                        {
                            Console.WriteLine("Property:  {0}, Value: {1}", propertyData.Name, propertyData.Value);
                        }
                    }
    
    
    
                }
    

    WIN32类名的完整列表可在http://msdn.microsoft.com/en-us/library/aa394084%28v=VS.85%29.aspx获得

    干杯。

    【讨论】:

    • 我正在运行 x64 ,但我仍然必须使用字符串 "var win32DeviceClassName = "win32_processor";"
    • 这里的代码 sn-p 应该可以满足您的要求。是的,将其复制到您的 C# 控制台项目的 main 函数中。它将枚举您的处理器的所有属性。
    • 你知道为什么我在尝试将 DateTime 对象设置为“InstallDate”属性时会出现类型不匹配吗?
    • 虽然 WMI 对象有一些相同的信息,但它们不提供查询设备管理器中显示的所有属性的方法,我可以找到(根据所提出的问题)。跨度>
    • 我做到了 - WMI 根本无法让您访问设备管理器中可用的所有相同状态。使用 SetupDiGetClassDevs & SetupDiGetDeviceRegistryProperty 列出的答案是正确答案。设备管理器中显示的所有状态项都可以使用 SetupDiGetDeviceRegistryProperty 获得。
    【解决方案2】:

    该问题使用 C# 标记,但实际问题要求任何 Window API。使用 Win32 API,可以使用SetupDiGetDeviceRegistryProperty() 检索信息。步骤是:

    1. 通过SetupDiGetClassDevs()获取您感兴趣的设备的设备信息集。
    2. 通过SetupDiEnumDeviceInfo() 遍历设备信息。
    3. 通过调用 SetupDiGetDeviceRegistryProperty() 获取属性。
    4. 销毁通过SetupDiDestroyDeviceInfoList()设置的设备信息。

    根据文档,该 API 可用于 Windows 2000 及更高版本。

    【讨论】:

    • 这是正确答案。要找到问题中要求的电源状态,您需要使用 SetupDiGetDeviceRegistryProperty 查询 SPDRP_DEVICE_POWER_DATA。
    【解决方案3】:

    使用 PowerShell 执行此操作将是最轻松的时间(我认为)。如果您正在编写一些 C# 代码,您可以使用 System.Management.Automation 命名空间中的类型执行 PS 脚本,例如 PowerShell(链接:http://msdn.microsoft.com/en-us/library/system.management.automation.powershell(v=vs.85).aspx),但我将使用 PS 控制台开始您的测试。

    您应该首先(使用 PowerShell)使用此命令在您的环境中探索 WMI 对象

    Get-WmiObject -List -namespace root\CIMV2
    

    然后,一旦您确定了要查找的类,就可以使用以下命令检索该类的详细信息:

    Get-WmiObject -namespace root\CIMV2 -class Win32_USBControllerDevice
    

    一旦您拥有该内容,您就必须解析文本。

    更新:尝试使用此命令获取 PC 上鼠标驱动程序的“状态”、“状态”和“已启动”属性:

    gwmi Win32_SystemDriver | where {$_.DisplayName -like "*Mouse*"}
    

    【讨论】:

    • 谢谢你,但我已经改进了这个问题。我想要的与你所支持的不同。使用 Power Shell 我可以获得所有 USB 设备及其属性的巨大列表,这些不是我想要的问,我猜。请看一下快照,以便更清楚地说明问题。
    • 通过正确的查询,您可以获得该精确值。我可以完善我的答案
    • 上面的鼠标命令没有给出像“Power Data”这样的变量?
    • 与其他 WMI 答案一样,WMI 不会让您访问所有相同的状态。
    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多