Tôi biết đã lâu rồi kể từ khi có bất kỳ hoạt động nào trong câu trả lời này, nhưng tôi đang làm việc trên một dự án yêu cầu một chức năng tương tự như vậy, và tôi có thể nói với bạn rằng điều đó thực sự có thể. Theo như tôi có thể nói, nó đòi hỏi DDK và PInvoke, không có giao diện C# hoặc WMI cho thông tin này. Nó yêu cầu mở các thiết bị trung tâm gốc USB cấp thấp và gửi trực tiếp các lệnh IOCTL của trình điều khiển tới chúng.
Tin tốt là, Microsoft cung cấp ứng dụng ví dụ C++ liệt kê hoàn toàn tất cả các thiết bị USB và hiển thị chính xác cổng nào được kết nối. Ứng dụng đó là USBView sample application.
Tôi nghĩ bạn sẽ tìm thấy nếu bạn biên dịch và chạy ứng dụng này, bạn sẽ thấy nó cho bạn thấy chính xác vị trí thiết bị của bạn được cắm vào, và nếu bạn cắm bất kỳ thiết bị nào vào cổng đó, nó sẽ xuất hiện ở cùng một nơi .Có lẽ nó có thể dễ dàng hơn nếu bạn tạo một C++ DLL không được quản lý cung cấp một vài cuộc gọi mà ứng dụng C# của bạn có thể sử dụng để lấy thông tin cần thiết.
Nó có này để nói về "EnumerateHubPorts()" chức năng trong nó là mã:
Với một tay cầm một hub mở và số lượng cổng hạ lưu trên trung tâm, gửi trung tâm một IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX Yêu cầu cho mỗi cổng hạ lưu của trung tâm để nhận thông tin về thiết bị (nếu có) được gắn vào mỗi cổng.
Để đưa ra ý tưởng về mọi thứ yêu cầu (mọi thứ phải được liệt kê bắt đầu ở trên cùng, ngay cả khi bạn chỉ quan tâm đến một cổng), dưới đây là các nhận xét được liệt kê ở đầu tệp enum.c trong mã:
/*
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.
*/
Dường như tôi có thể lấy vị trí từ sổ đăng ký qua 'HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ USB'. Tôi sẽ viết một câu trả lời khi tôi xác minh nó. –
Người ta có thể mong đợi rằng, vì API không phải WMI được đặt tên ['SetupDiGetDeviceRegistryProperty'] (http://msdn.microsoft.com/en-us/library/ff551967.aspx) –
Trông giống như LocationInformation trong HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Enum \ USB không được cập nhật khi thiết bị được cắm vào một cổng khác hoặc – Derek