Как определить, когда вставлен съемный диск с использованием C #? - PullRequest
16 голосов
/ 07 ноября 2008

Я просто обеспокоен Windows, так что нет необходимости углубляться в эзотерику по поводу совместимости с Mono или чего-то подобного.

Я должен также добавить, что приложение, которое я пишу, является WPF, и я бы предпочел избегать зависимости от System.Windows.Forms, если это вообще возможно.

Ответы [ 3 ]

16 голосов
/ 07 ноября 2008

Дайте этому шанс ...

using System;
using System.Collections.Generic;
using System.Text;
using System.Management;

namespace WMITestConsolApplication
{

    class Program
    {

        static void Main(string[] args)
        {

            AddInsertUSBHandler();
            AddRemoveUSBHandler();
            while (true) {
            }

        }

        static ManagementEventWatcher w = null;

        static void AddRemoveUSBHandler()
        {

            WqlEventQuery q;
            ManagementScope scope = new ManagementScope("root\\CIMV2");
            scope.Options.EnablePrivileges = true;

            try {

                q = new WqlEventQuery();
                q.EventClassName = "__InstanceDeletionEvent";
                q.WithinInterval = new TimeSpan(0, 0, 3);
                q.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'";
                w = new ManagementEventWatcher(scope, q);
                w.EventArrived += USBRemoved;

                w.Start();
            }
            catch (Exception e) {


                Console.WriteLine(e.Message);
                if (w != null)
                {
                    w.Stop();

                }
            }

        }

        static void AddInsertUSBHandler()
        {

            WqlEventQuery q;
            ManagementScope scope = new ManagementScope("root\\CIMV2");
            scope.Options.EnablePrivileges = true;

            try {

                q = new WqlEventQuery();
                q.EventClassName = "__InstanceCreationEvent";
                q.WithinInterval = new TimeSpan(0, 0, 3);
                q.Condition = "TargetInstance ISA 'Win32_USBControllerdevice'";
                w = new ManagementEventWatcher(scope, q);
                w.EventArrived += USBInserted;

                w.Start();
            }
            catch (Exception e) {

                Console.WriteLine(e.Message);
                if (w != null)
                {
                    w.Stop();

                }
            }

        }

        static void USBInserted(object sender, EventArgs e)
        {

            Console.WriteLine("A USB device inserted");

        }

        static void USBRemoved(object sender, EventArgs e)
        {

            Console.WriteLine("A USB device removed");

        }
    }

}
9 голосов
/ 07 ноября 2008

Есть гораздо менее громоздкие способы сделать это, чем использовать опрос WMI - просто захватите WM_DEVICECHANGE:

http://msdn.microsoft.com/en-us/library/aa363215.aspx

1 голос
/ 07 ноября 2008

Самый простой способ - создать обработчик автозапуска:

http://www.codeproject.com/KB/system/AutoplayDemo.aspx

Автоигра Версия 2 является функцией в Windows XP, которая будет сканировать первый четыре уровня съемного носителя, когда он прибывает в поисках медиа-контента типы (музыка, графика или видео). Регистрация заявок сделана на основе типа контента. Когда приходит съемный носитель, Windows XP определяет, какие действия выполнять оценка содержания и сравнение это зарегистрированным обработчикам для этого содержание.

A также доступна подробная статья MSDN .

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