2011-11-18 11 views
8

Làm thế nào để bắt sự kiện khi ổ đĩa mới được thêm vào Máy tính của tôi và tốt nhất là khi nào điểm lắp mới cho một số ổ đĩa được tạo trên ổ đĩa NTFS?Phát hiện sự kiện gắn ổ đĩa trong C#


tôi figued ra điều này, nhưng nó không hoạt động trên các thư mục gắn kết:

_eventWatcher = new ManagementEventWatcher("SELECT * FROM Win32_VolumeChangeEvent"); 

_eventWatcher.EventArrived += (o, args) => 
    {switch(args.NewEvent["EventType"].ToString()[0]) 
     { 
      case '2': 
       //mount 
       Debug.WriteLine(args.NewEvent["DriveName"]); 
       break; 
      case '3': 
       //unmount 
       break; 
     } 
    }; 

_eventWatcher.Start(); 

Bất kỳ ý tưởng?

+0

có thể trùng lặp của: http://stackoverflow.com/questions/4019065/monitoring-drives- with-wmi – aleroot

+1

Với Windows API, bạn nên xử lý tin nhắn WM_DEVICECHANGE. Tuy nhiên, không biết cách xử lý nó trong C#. –

+0

Có một cái gì đó như thế này chỉ cho các thư mục được gắn trên ổ đĩa NTFS? – user629926

Trả lời

7

Nếu bạn có một hình thức, bạn có thể ghi đè WndProc phương pháp của mình để nhận được các thư WM_DEVICECHANGE như Eugene nói:

private const int WM_DEVICECHANGE = 0x219; 

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(m); 

    if (m.Msg == WM_DEVICECHANGE) 
    { 
     // Check m.wParam to see exactly what happened 
    } 
} 
+0

Tôi có lẽ sẽ cần phải chuyển mã của tôi vào cửa sổ dịch vụ một thời gian sau đó để giải pháp này sẽ không hoạt động. Dù sao cũng cảm ơn bạn. – user629926

+0

nếu bạn muốn làm điều đó trong một dịch vụ Windows, bạn phải kiểm tra này: http://www.codeproject.com/KB/system/Windows_Services.aspx?msg=2900262 –