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





Самый простой способ - создать обработчик автозапуска:
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.
Также доступен подробная статья MSDN.
Это довольно круто, но я просто ищу что-то, что будет работать, пока работает мое программное обеспечение. Спасибо хоть.
Попробуйте это ...
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");
}
}
}
В какой сборке находится ManagementEventWatcher?
System.Management, согласно этой статье MSDN: msdn.microsoft.com/en-us/library/…
Похоже, он находится в System.Management.dll - msdn.microsoft.com/en-us/library/…
@Josh: могу ли я порекомендовать вам переименовать «AddInsetUSBHandler» в «AddInsertUSBHandler»?
В моей системе я получаю 4 события вставки и 4 события удаления, когда подключаюсь, затем выдергиваю свой флеш-накопитель ...
В моей системе я получаю два события вставки и два события удаления. Кажется, не могу их отличить. Есть идеи?
Есть гораздо менее громоздкие способы сделать это, чем использование опроса WMI - просто захватите WM_DEVICECHANGE:
Мы говорим о USB-порте?