Как получить информацию о недавно подключенном USB-устройстве - PullRequest
0 голосов
/ 21 января 2019

Я могу поймать, когда USB-устройство подключено к Win32_DeviceChangeEvent

, но есть только 3 свойства, разрешенные для просмотра

class Win32_DeviceChangeEvent : __ExtrinsicEvent
{
  uint8  SECURITY_DESCRIPTOR[];
  uint64 TIME_CREATED;
  uint16 EventType;
};

Но я не понимаю, как получить все информацию об этом устройстве. В частности, это порт и концентратор, VirtualHubAdress Name и т. Д.

public enum EventType
{
    Inserted = 2,
    Removed = 3
}

public static void RegisterUsbDeviceNotification()
{
    var watcher = new ManagementEventWatcher();
    var query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2");
    //watcher.EventArrived += new EventArrivedEventHandler(watcher_EventArrived);
    watcher.EventArrived += (s, e) =>
    {
        //here is im need to get info about this device

        EventType eventType = (EventType)(Convert.ToInt16(e.NewEvent.Properties["EventType"].Value));
    };

    watcher.Query = query;
    watcher.Start();
}

может быть, я смогу сделать это, используя что-то вроде этого

[DllImport("UseFull.dll")] 
private IntpPtr GetAllinfo(params);

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Вы можете использовать ORMi для создания наблюдателя, чтобы вы могли получить информацию о любом новом устройстве:

WMIHelper helper = new WMIHelper("root\\CimV2");

WMIWatcher watcher = new WMIWatcher("root\\CimV2", "SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_PnPEntity'");
watcher.WMIEventArrived += Watcher_WMIEventArrived;

И затем вы можете наблюдать за событиями:

private static void Watcher_WMIEventArrived(object sender, WMIEventArgs e)
{
    //DO YOUR WORK
}
0 голосов
/ 22 января 2019

Win32_DeviceChangeEvent сообщает только тип произошедшего события и время события (uint64, представляющее интервалы в 100 наносекунд после 1 января 1601 года, UTC). Не так уж и полезно, если вы также хотите знать, что прибыло или было удалено.

Я предлагаю вместо этого использовать класс WqlEventQuery , установив для EventClassName значение __InstanceOperationEvent.
Этот системный класс предоставляет свойство TargetInstance, которое можно привести к ManagementBaseObject , полному объекту управления, который также предоставляет базовую информацию об устройстве, сгенерировавшем событие.
Среди этой информации (которая включает понятное имя устройства), PNPDeviceID, которая может использоваться для создания других запросов для дальнейшей проверки устройства, на которое ссылаются.

Свойство WqlEventQuery Condition можно установить здесь TargetInstance ISA 'Win32_DiskDrive'.
Можно установить любой другой класс Win32_.

Настройка прослушивателя событий (локальный компьютер):
(Обработчик события называется DeviceChangedEvent)

WqlEventQuery query = new WqlEventQuery() {
    EventClassName = "__InstanceOperationEvent",
    WithinInterval = new TimeSpan(0, 0, 3),
    Condition = @"TargetInstance ISA 'Win32_DiskDrive'"
};

ManagementScope scope = new ManagementScope("root\\CIMV2");
using (ManagementEventWatcher MOWatcher = new ManagementEventWatcher(scope, query))
{
    MOWatcher.Options.Timeout = ManagementOptions.InfiniteTimeout;
    MOWatcher.EventArrived += new EventArrivedEventHandler(DeviceChangedEvent);
    MOWatcher.Start();
}

Обработчик события получает в e.NewEvent.Properties["TargetInstance"] объект управления, представляющий класс Win32_DiskDrive .
Смотрите Документы о свойствах, прямо доступных здесь.

Интересующие производные классы __InstanceOperationEvent, сообщаемые e.NewEvent.ClassPath.ClassName, могут быть:

__ InstanceCreationEvent : Обнаружено прибытие нового устройства.
__ InstanceDeletionEvent : Обнаружено удаление устройства.
__ InstanceModificationEvent : Существующее устройство было каким-то образом модифицировано.

Обратите внимание, что событие возникает во вторичном потоке, нам нужно BeginInvoke поток пользовательского интерфейса, чтобы обновить пользовательский интерфейс с новой информацией.

См. Здесь: Получите серийный номер запоминающего устройства USB для класса, который предоставляет большую часть информации, доступной об устройстве (информация фильтруется, чтобы показать только устройства USB, но фильтр можно удалить) ,

private void DeviceChangedEvent(object sender, EventArrivedEventArgs e)
{
    using (ManagementBaseObject MOBbase = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)
    {
        string oInterfaceType = MOBbase?.Properties["InterfaceType"]?.Value.ToString();
        string devicePNPId = MOBbase?.Properties["PNPDeviceID"]?.Value.ToString();
        string deviceDescription = MOBbase?.Properties["Caption"]?.Value.ToString();
        string EventMessage = $"{oInterfaceType}: {deviceDescription} ";

        switch (e.NewEvent.ClassPath.ClassName)
        {
            case "__InstanceDeletionEvent":
                EventMessage += " removed";
                this.BeginInvoke(new MethodInvoker(() => { this.UpdateUI(EventMessage); }));
                break;
            case "__InstanceCreationEvent":
                EventMessage += "inserted";
                this.BeginInvoke(new MethodInvoker(() => { this.UpdateUI(EventMessage); }));
                break;
            case "__InstanceModificationEvent":
            default:
                Console.WriteLine(e.NewEvent.ClassPath.ClassName);
                break;
        }
    }
}


private void UpdateUI(string message)
{
   //Update the UI controls with the updated informations
}
0 голосов
/ 21 января 2019

Вы можете попробовать использовать Win32_PnPEntity для получения подробной информации. Win32_PnPEntity class

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...