2008-11-07 40 views
16

Tôi chỉ quan tâm đến Windows, vì vậy không cần phải đi vào bí truyền về tính tương thích của Mono hay bất cứ thứ gì như thế.Làm thế nào để phát hiện khi ổ đĩa di động được lắp bằng C#?

Tôi cũng nên thêm rằng ứng dụng tôi đang viết là WPF và tôi muốn tránh phụ thuộc vào System.Windows.Forms nếu có thể.

+0

chúng ta đang nói về một USB Hải cảng? –

+0

Ổ USB sẽ là một ví dụ về một ổ đĩa di động, nhưng Windows thường xử lý chúng giống như ổ đĩa quang và tương tự khi nói đến các sự kiện. –

Trả lời

16

này cung cấp cho một 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

ManagementEventWatcher là gì? –

+0

System.Management, theo bài viết MSDN này: http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx – ine

+1

Dường như nó nằm trong System.Management.dll - http: // msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.aspx –

1

Cách đơn giản nhất là tạo ra một Handler Autoplay:

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

Autoplay Phiên bản 2 là một tính năng trong Windows XP mà sẽ quét bốn cấp độ đầu tiên của một phương tiện di động, khi nó đến, tìm kiếm nội dung phương tiện loại (nhạc, đồ họa hoặc video). Đăng ký các ứng dụng được thực hiện trên cơ sở loại nội dung. Khi một phương tiện di động đến, Windows XP xác định hành động nào cần thực hiện bằng cách đánh giá nội dung và so sánh với phương tiện xử lý đã đăng ký cho nội dung đó.

A detailed MSDN article cũng khả dụng.

+0

Đó là khá mát mẻ, nhưng tôi thực sự chỉ tìm kiếm cái gì đó sẽ hoạt động trong khi phần mềm của tôi đang chạy. Cảm ơn, mặc dù. –

Các vấn đề liên quan