本文介绍了如何检测连接到串行COM端口的硬件何时被删除?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
美好的一天论坛家庭。请帮我一个方法来检测连接到串行COM端口的硬件何时(断开连接)被删除?我已尝试过下面的代码,但它无法正常工作或触发。
Good day Forum Family. Kindly help me with a way to detect when hardware connected to serial com port is (disconnected)removed? I have tried the code below but it is not working or firing.
private void scanningPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
MessageBox.Show("Hardware Removed");
}
推荐答案
public enum Win32_LogicalDisk_EventTypeEnum
{
Creation,
Deletion,
Modification
};
public enum Win32_LogicalDisk_DriveTypeEnum
{
Unknown = 0,
NoRootDirectory = 1,
RemovableDisk = 2,
LocalDisk = 3,
NetworkDrive = 4,
CompactDisc = 5,
RAMDisk = 6
};
public class Win32_LogicalDisk : IEquatable<Win32_LogicalDisk>
{
public UInt32 DriveType { get; set; }
public UInt64 Size { get; set; }
public UInt64 FreeSpace { get; set; }
public string Name { get; set; }
public string DeviceID { get; set; }
public string FileSystem { get; set; }
public string VolumeName { get; set; }
public string VolumeSerialNumber { get; set; }
public string Description { get; set; }
public Win32_LogicalDisk_EventTypeEnum EventType { get; set; }
public Win32_LogicalDisk_DriveTypeEnum GetDriveType
{
get { return (Win32_LogicalDisk_DriveTypeEnum)this.DriveType; }
}
public bool Equals(Win32_LogicalDisk other)
{
if (other == null)
return false;
if (this.VolumeSerialNumber == other.VolumeSerialNumber)
return true;
else
return false;
}
public override bool Equals(Object obj)
{
if (obj == null)
return false;
Win32_LogicalDisk diskObj = obj as Win32_LogicalDisk;
if (diskObj == null)
return false;
else
return Equals(diskObj);
}
public override int GetHashCode()
{
return this.VolumeSerialNumber.GetHashCode();
}
public static bool operator ==(Win32_LogicalDisk disk1, Win32_LogicalDisk disk2)
{
if ((object)disk1 == null || ((object)disk2) == null)
return Object.Equals(disk1, disk2);
return disk1.Equals(disk2);
}
public static bool operator !=(Win32_LogicalDisk disk1, Win32_LogicalDisk disk2)
{
if (disk1 == null || disk2 == null)
return !Object.Equals(disk1, disk2);
return !(disk1.Equals(disk2));
}
}
和其他任务对象类:
and the other task object class:
using System;
using System.Management;
using FileGeo.CommonObjects;
using FileGeo.Operational.TaskThreadingModel;
namespace FileGeo.TaskOperations
{
public class LogicalDiskAddedEventArgs : EventArgs, IDisposable
{
#region Constructor
public LogicalDiskAddedEventArgs(
Win32_LogicalDisk LogicalDisk)
{
this.LogicalDisk = LogicalDisk;
}
#endregion
#region Property
/// <summary>
/// Gets the logical disk added to the system.
/// </summary>
public Win32_LogicalDisk LogicalDisk { get; private set; }
#endregion
#region IDisposable Members
void IDisposable.Dispose()
{
GC.SuppressFinalize(this);
}
#endregion
}
public class LogicalDiskRemovedEventArgs : EventArgs, IDisposable
{
#region Constructor
public LogicalDiskRemovedEventArgs(
Win32_LogicalDisk LogicalDisk)
{
this.LogicalDisk = LogicalDisk;
}
#endregion
#region Property
/// <summary>
/// Gets the logical disk removed from the system.
/// </summary>
public Win32_LogicalDisk LogicalDisk { get; private set; }
#endregion
#region IDisposable Members
void IDisposable.Dispose()
{
GC.SuppressFinalize(this);
}
#endregion
}
public class LogicalDiskModifiedEventArgs : EventArgs, IDisposable
{
#region Constructor
public LogicalDiskModifiedEventArgs(
Win32_LogicalDisk OldLogicalDisk, Win32_LogicalDisk ModifiedLogicalDisk)
{
this.OldLogicalDisk = OldLogicalDisk;
this.ModifiedLogicalDisk = ModifiedLogicalDisk;
}
#endregion
#region Property
/// <summary>
/// Gets the old logical disk from the system.
/// </summary>
public Win32_LogicalDisk OldLogicalDisk { get; private set; }
/// <summary>
/// Gets the modified logical disk from the system.
/// </summary>
public Win32_LogicalDisk ModifiedLogicalDisk { get; private set; }
#endregion
#region IDisposable Members
void IDisposable.Dispose()
{
GC.SuppressFinalize(this);
}
#endregion
}
/// <summary>
/// This example shows synchronous consumption of events. The task thread is blocked while waiting for events.
/// </summary>
public class Win32_LogicalDiskManagementTask : TaskWrapperBase
{
#region Events
public event EventHandler<LogicalDiskAddedEventArgs> LogicalDiskAdded;
public event EventHandler<LogicalDiskRemovedEventArgs> LogicalDiskRemoved;
public event EventHandler<LogicalDiskModifiedEventArgs> LogicalDiskModified;
#endregion
#region Constructor
public Win32_LogicalDiskManagementTask(System.Windows.Forms.Control invokeContext)
{
this.InvokeContext = invokeContext;
}
#endregion
public System.Windows.Forms.Control InvokeContext { get; private set; }
/// <summary>
/// Bu kanal işleminin sonlanması beklenmeyecek, client sonlandığında bu kanal da kapatılsın.(Uygulama kapanana kadar kendisi sonlanabilir)
/// </summary>
protected override bool IsBlockUntilTerminated
{
get
{
return false;
}
}
public override string OperationName
{
get
{
return "Win32_LogicalDisk management operation";
}
}
public override void Dispose()
{
System.GC.SuppressFinalize(this);
}
protected override void DoTask()
{
ManagementEventWatcher watcher = null;
try
{
// Create event query to be notified within 1 second of a change in a service.
WqlEventQuery query = new WqlEventQuery("__InstanceOperationEvent", new TimeSpan(0, 0, 1),
"TargetInstance isa \"Win32_LogicalDisk\"");
// Initialize an event watcher and subscribe to events that match this query.
watcher = new ManagementEventWatcher(query);
do
{
// Initialize the logical disks to the default values.
Win32_LogicalDisk previousDisk, targetDisk = null;
// Block until the next event occurs.
ManagementBaseObject o = watcher.WaitForNextEvent();
switch (o.ClassPath.ClassName)
{
case "__InstanceCreationEvent":
targetDisk = InvokeLogicalDisk(o["TargetInstance"] as ManagementBaseObject,
Win32_LogicalDisk_EventTypeEnum.Creation);
if (targetDisk != null && InvokeContext.IsHandleCreated)
{
using (LogicalDiskAddedEventArgs ea = new LogicalDiskAddedEventArgs(targetDisk))
{
// Fire notification event on the user interface thread.
InvokeContext.Invoke(
new EventHandler<LogicalDiskAddedEventArgs>(OnLogicalDiskAdded),
new object[] { this, ea });
}
}
break;
case "__InstanceDeletionEvent":
targetDisk = InvokeLogicalDisk(o["TargetInstance"] as ManagementBaseObject,
Win32_LogicalDisk_EventTypeEnum.Deletion);
if (targetDisk != null && InvokeContext.IsHandleCreated)
{
using (LogicalDiskRemovedEventArgs ea = new LogicalDiskRemovedEventArgs(targetDisk))
{
// Fire notification event on the user interface thread.
InvokeContext.Invoke(
new EventHandler<LogicalDiskRemovedEventArgs>(OnLogicalDiskRemoved),
new object[] { this, ea });
}
}
break;
case "__InstanceModificationEvent":
previousDisk = InvokeLogicalDisk(o["PreviousInstance"] as ManagementBaseObject,
Win32_LogicalDisk_EventTypeEnum.Modification);
targetDisk = InvokeLogicalDisk(o["TargetInstance"] as ManagementBaseObject,
Win32_LogicalDisk_EventTypeEnum.Modification);
if (previousDisk != null && targetDisk != null && InvokeContext.IsHandleCreated)
{
using (LogicalDiskModifiedEventArgs ea = new LogicalDiskModifiedEventArgs(previousDisk, targetDisk))
{
// Fire notification event on the user interface thread.
InvokeContext.Invoke(
new EventHandler<LogicalDiskModifiedEventArgs>(OnLogicalDiskModified),
new object[] { this, ea });
}
}
break;
}
} while (true);
}
catch (Exception)
{
if (watcher != null)
{
// Cancel the subscription.
watcher.Stop();
// Dispose the watcher object and release it.
watcher.Dispose();
watcher = null;
}
throw;
}
}
#region Helper Methods
private Win32_LogicalDisk InvokeLogicalDisk(ManagementBaseObject obj, Win32_LogicalDisk_EventTypeEnum eventType)
{
Win32_LogicalDisk result = null;
if (obj != null)
{
result = new Win32_LogicalDisk() { EventType = eventType };
result.DriveType = Convert.ToUInt32(obj["DriveType"]);
result.Size = Convert.ToUInt64(obj["Size"]);
result.FreeSpace = Convert.ToUInt64(obj["FreeSpace"]);
result.Name = (obj["Name"] ?? "").ToString();
result.DeviceID = (obj["DeviceID"] ?? "").ToString();
result.FileSystem = (obj["FileSystem"] ?? "").ToString();
result.VolumeName = (obj["VolumeName"] ?? "").ToString();
result.VolumeSerialNumber = (obj["VolumeSerialNumber"] ?? "").ToString();
result.Description = (obj["Description"] ?? "").ToString();
}
return result;
}
private void OnLogicalDiskAdded(object sender, LogicalDiskAddedEventArgs e)
{
if (LogicalDiskAdded != null)
LogicalDiskAdded(sender, e);
}
private void OnLogicalDiskRemoved(object sender, LogicalDiskRemovedEventArgs e)
{
if (LogicalDiskRemoved != null)
LogicalDiskRemoved(sender, e);
}
private void OnLogicalDiskModified(object sender, LogicalDiskModifiedEventArgs e)
{
if (LogicalDiskModified != null)
LogicalDiskModified(sender, e);
}
#endregion
}
}
using System.Management;
namespace UsbDection
{
class Program
{
static ManagementEventWatcher watchingObect = null;
static WqlEventQuery watcherQuery;
static ManagementScope scope;
static void Main(string[] args)
{
scope = new ManagementScope("root\\CIMV2");
scope.Options.EnablePrivileges = true;
AddInsetUSBHandler();
AddRemoveUSBHandler();
for (; ; ) ;
}
public static void AddRemoveUSBHandler()
{
try
{
USBWatcherSetUp("__InstanceDeletionEvent");
watchingObect.EventArrived += new EventArrivedEventHandler(USBRemoved);
watchingObect.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
if (watchingObect != null)
watchingObect.Stop();
}
}
static void AddInsetUSBHandler()
{
try
{
USBWatcherSetUp("__InstanceCreationEvent");
watchingObect.EventArrived += new EventArrivedEventHandler(USBAdded);
watchingObect.Start();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
if (watchingObect != null)
watchingObect.Stop();
}
}
private static void USBWatcherSetUp(string eventType)
{
watcherQuery = new WqlEventQuery();
watcherQuery.EventClassName = eventType;
watcherQuery.WithinInterval = new TimeSpan(0, 0, 2);
watcherQuery.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'";
watchingObect = new ManagementEventWatcher(scope, watcherQuery);
}
public static void USBAdded(object sender, EventArgs e)
{
Console.WriteLine("A USB device inserted");
}
public static void USBRemoved(object sender, EventArgs e)
{
Console.WriteLine("A USB device removed");
}
}
}
以上代码正常运行,但我需要帮助获取添加或删除设备的名称。
The above code is working but I need help getting the name of the device added or removed.
这篇关于如何检测连接到串行COM端口的硬件何时被删除?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!