gpt4 book ai didi

c# - 在 C# 中枚举 Windows 可移植设备

转载 作者:可可西里 更新时间:2023-11-01 08:22:12 25 4
gpt4 key购买 nike

我正在尝试使用 Windows 可移植设备 API 和此 API 提供的 PortableDeviceManager 在 Windows 上枚举已连接的可移植设备。

我已经按照 MSDN 文档 link 实现了设备 ID 枚举。和各种博客 link ,但它们都会导致相同的问题 - 当有多个连接时,我只能让它为我提供一个设备的 ID。

这是我正在使用的 C# 代码片段:

PortableDeviceManagerClass deviceManager = new PortableDeviceManagerClass();
deviceManager.RefreshDeviceList();

uint numberOfDevices = 1;
deviceManager.GetDevices(null, ref numberOfDevices);

if (numberOfDevices == 0)
{
return new string[0];
}

string [] deviceIds = new string[numberOfDevices];
deviceManager.GetDevices(ref deviceIds[0], ref numberOfDevices);

return deviceIds;

我的电脑连接了两台设备,一台可移动 USB 内存棒和一台数码相机。当两者都处于事件状态时,只会返回我的相机的设备 ID。当我停用相机时,返回可移动 USB 内存棒的设备 ID。

有没有人有使用此 API 的经验,可以指出我做错的方向?

最佳答案

贾兰,

看看 WPD 团队的以下帖子,它提到了如何修复互操作程序集。

http://blogs.msdn.com/b/dimeby8/archive/2006/12/05/enumerating-wpd-devices-in-c.aspx

为了完整起见,我也会在这里提到答案:

这是由于编码限制。此示例代码将仅检测一个设备。您需要手动修复互操作程序集。

  • 使用以下命令反汇编 PortableDeviceApi Interop 程序集:

    ildasm Interop.PortableDeviceApiLib.dll/out:pdapi.il

  • 在记事本中打开 IL 并搜索以下字符串:

    实例 void GetDevices([in][out] string& marshal(lpwstr) pPnPDeviceIDs,

  • 用以下字符串替换上面字符串的所有实例:

    实例 void GetDevices([in][out] string[] marshal([]) pPnPDeviceIDs,

  • 保存 IL 并使用以下命令重新组装互操作:

    ilasm pdapi.il/dll/output=Interop.PortableDeviceApiLib.dll

重建您的项目。您现在可以先使用 NULL 参数调用 GetDevices 以获取设备数量,然后使用数组再次调用它以获取设备 ID。

希望这对您有所帮助。

关于c# - 在 C# 中枚举 Windows 可移植设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6162046/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com