WMI и Win32_DeviceChangeEvent - возвращен неправильный тип события? - PullRequest
4 голосов
/ 02 сентября 2008

Я пытаюсь зарегистрироваться на событие «Устройство добавлено / Устройство удалено» с помощью WMI. Когда я говорю устройство - я имею в виду что-то в строках диска на ключе или любого другого устройства, на котором есть файлы, к которым я могу получить доступ ...

Я регистрируюсь на событие, и оно вызывается, но свойство EventType отличается от того, которое я ожидаю увидеть.

В документации ( MSDN ) говорится: 1- изменение конфигурации, 2- добавление устройства, 3-удаление устройства 4- стыковка. По какой-то причине я всегда получаю значение 1.

Есть идеи?

Вот пример кода:

public class WMIReceiveEvent
{
    public WMIReceiveEvent()
    {
        try
        {
            WqlEventQuery query = new WqlEventQuery(
                "SELECT * FROM Win32_DeviceChangeEvent");

            ManagementEventWatcher watcher = new ManagementEventWatcher(query);
            Console.WriteLine("Waiting for an event...");

            watcher.EventArrived += 
                new EventArrivedEventHandler(
                HandleEvent);

            // Start listening for events
            watcher.Start();

            // Do something while waiting for events
            System.Threading.Thread.Sleep(10000);

            // Stop listening for events
            watcher.Stop();
            return;
        }
        catch(ManagementException err)
        {
            MessageBox.Show("An error occurred while trying to receive an event: " + err.Message);
        }
    }

    private void HandleEvent(object sender,
        EventArrivedEventArgs e)
    {
        Console.WriteLine(e.NewEvent.GetPropertyValue["EventType"]);
    }

    public static void Main()
    {
        WMIReceiveEvent receiveEvent = new WMIReceiveEvent();
        return;
    }
}

Ответы [ 4 ]

1 голос
/ 15 сентября 2008

Ну, я не смог найти код. Пробовал на моем старом аккаунте RAC, ничего. Ничего в моих старых резервных копиях. Пойди разберись. Но я попытался выяснить, как я это сделал, и я думаю, что это правильная последовательность (я основал многое из этой статьи ):

  1. Получить все буквы дисков и кеш их.
  2. Подождите, пока WM_DEVICECHANGE сообщение и запустить таймер с тайм-аут в 1 секунду (это сделано для избегать много ложного WM_DEVICECHANGE сообщения, которые начинаются как только вы начнете вставлять USB-ключ / другое устройство и только конец когда диск "улажен").
  3. Сравните буквы дисков с старый кеш и обнаружение новых.
  4. Получить информацию об устройстве для тех.

Я знаю, что есть и другие методы, но они оказались единственными, которые будут последовательно работать в разных версиях окон, и нам было необходимо, чтобы мой клиент использовал элемент управления ActiveX на веб-странице, которая загружала изображения с любого устройства Вы вставили (я думаю, что они создали какой-то печатный киоск).

0 голосов
/ 08 марта 2010

Я попробовал это на своей системе и в итоге получил правильный код. Это займет некоторое время. Я получаю дюжину или около того событий, и одним из них является код подключения устройства.

0 голосов
/ 13 июля 2009

Ну

Вы можете попробовать класс диска win32_logical и связать его с событием __Instancecreation. Вы можете легко получить необходимую информацию

0 голосов
/ 03 сентября 2008

О! Да, я прошел через это, но некоторое время назад использовал необработанные вызовы API Windows, когда разрабатывал элемент управления ActiveX, который обнаружил вставку любого типа носителя. Я попытаюсь найти код из моих резервных копий и посмотреть, смогу ли я рассказать вам, как я его решил. Я подпишусь на RSS на всякий случай, если кто-то придет туда первым.

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