Wiem, że upłynęło trochę czasu, odkąd podjęto jakiekolwiek działania w związku z tą odpowiedzią, ale pracuję nad projektem, który również wymaga podobnej funkcjonalności, i mogę powiedzieć, że jest to rzeczywiście możliwe. O ile mogę powiedzieć, wymaga DDK i PInvoke, nie ma interfejsu C# lub WMI dla tych informacji. Wymaga to otwarcia niskiego poziomu koncentratorów USB USB i bezpośredniego wysyłania do nich poleceń IOCTL sterownika.
Dobra wiadomość jest taka, że Microsoft dostarcza przykładową aplikację C++, która całkowicie wylicza wszystkie urządzenia USB i pokazuje dokładnie, do których portów są podłączone. Ta aplikacja to USBView sample application.
Myślę, że znajdziesz, jeśli skompilujesz i uruchomisz tę aplikację, zobaczysz, że pokazuje dokładnie, gdzie jest podłączone urządzenie, a jeśli podłączysz dowolne urządzenie do tego portu, pojawi się w tym samym miejscu .Być może może być łatwiejsze, jeśli utworzysz niezarządzaną bibliotekę DLL w C++, która zapewnia kilka wywołań, z których może korzystać aplikacja C# do uzyskania potrzebnych informacji.
on ma do powiedzenia o „EnumerateHubPorts()” funkcja w to kod:
Biorąc pod uwagę uchwyt do otwartej piasty oraz liczby portów downstream na piasta, wyślij piastę IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX żądanie dla każdego dalszego portu w hoście, aby uzyskać informacje o urządzeniu (jeśli jest) podłączonym do każdego portu.
Aby dać wyobrażenie o wszystkim wymaga to (wszystko musi być numerowane, zaczynając od góry, nawet jeśli jesteś zainteresowany tylko w jednym porcie) Oto komentarze wymienione na początku pliku enum.c w kodzie:
/*
This source file contains the routines which enumerate the USB bus
and populate the TreeView control.
The enumeration process goes like this:
(1) Enumerate Host Controllers and Root Hubs
EnumerateHostControllers()
EnumerateHostController()
Host controllers currently have symbolic link names of the form HCDx,
where x starts at 0. Use CreateFile() to open each host controller
symbolic link. Create a node in the TreeView to represent each host
controller.
GetRootHubName()
After a host controller has been opened, send the host controller an
IOCTL_USB_GET_ROOT_HUB_NAME request to get the symbolic link name of
the root hub that is part of the host controller.
(2) Enumerate Hubs (Root Hubs and External Hubs)
EnumerateHub()
Given the name of a hub, use CreateFile() to map the hub. Send the
hub an IOCTL_USB_GET_NODE_INFORMATION request to get info about the
hub, such as the number of downstream ports. Create a node in the
TreeView to represent each hub.
(3) Enumerate Downstream Ports
EnumerateHubPorts()
Given an handle to an open hub and the number of downstream ports on
the hub, send the hub an IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX
request for each downstream port of the hub to get info about the
device (if any) attached to each port. If there is a device attached
to a port, send the hub an IOCTL_USB_GET_NODE_CONNECTION_NAME request
to get the symbolic link name of the hub attached to the downstream
port. If there is a hub attached to the downstream port, recurse to
step (2).
GetAllStringDescriptors()
GetConfigDescriptor()
Create a node in the TreeView to represent each hub port
and attached device.
*/
wygląda jak mogę uzyskać lokalizację z rejestru poprzez 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ USB'. Napiszę odpowiedź, gdy ją zweryfikuję. –
Można by się spodziewać, że ponieważ interfejs API nie-WMI ma nazwę ['SetupDiGetDeviceRegistryProperty'] (http://msdn.microsoft.com/en-us/library/ff551967.aspx) –
Wygląda jak informacja o lokalizacji w kluczu HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ USB nie jest aktualizowany, gdy urządzenie jest podłączone do innego portu – Derek