How do I detect when a removable disk is inserted using C#?

前端 未结 3 1005
夕颜
夕颜 2020-12-05 05:23

I\'m just concerned about Windows, so there\'s no need to go into esoterica about Mono compatibility or anything like that.

I should also add that the app that I\'m

相关标签:
3条回答
  • 2020-12-05 06:08

    Give this a shot...

    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");
    
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-12-05 06:09

    The simplest way would be to create an Autoplay Handler:

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

    Autoplay Version 2 is a feature in Windows XP that will scan the first four levels of a removable media, when it arrives, looking for media content types (music, graphics, or video). Registration of applications is done on a content type basis. When a removable media arrives, Windows XP determines what actions to perform by evaluating the content and comparing it to registered handlers for that content.

    A detailed MSDN article is also available.

    0 讨论(0)
  • 2020-12-05 06:10

    There are much less cumbersome ways of doing this than using WMI polling - just capture WM_DEVICECHANGE:

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

    0 讨论(0)
提交回复
热议问题