java监听usb拔插,C#中USB转串口的拔插捕获

// usb消息定义

public const int WM_DEVICE_CHANGE = 0x219;

public const int DBT_DEVICEARRIVAL = 0x8000;

public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004;

public const UInt32 DBT_DEVTYP_PORT = 0x00000003;

[StructLayout(LayoutKind.Sequential)]

struct DEV_BROADCAST_HDR

{

public UInt32 dbch_size;

public UInt32 dbch_devicetype;

public UInt32 dbch_reserved;

}

[StructLayout(LayoutKind.Sequential)]

protected struct DEV_BROADCAST_PORT_Fixed

{

public uint dbcp_size;

public uint dbcp_devicetype;

public uint dbcp_reserved;

// Variable?length field dbcp_name is declared here in the C header file.

}

///

/// 检测USB串口的拔插

///

///

protected override void WndProc(ref Message m)

{

if (m.Msg == WM_DEVICE_CHANGE) // 捕获USB设备的拔出消息WM_DEVICECHANGE

{

switch (m.WParam.ToInt32())

{

case DBT_DEVICE_REMOVE_COMPLETE: // USB拔出

DEV_BROADCAST_HDR dbhd = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));

if (dbhd.dbch_devicetype == DBT_DEVTYP_PORT)

{

string portName = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() + Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));

if (cbPort.Items.Contains(portName))

{

cbPort.Items.Remove(portName);

}

if (wr != null)

{

wr.Close();

}

}

break;

case DBT_DEVICEARRIVAL: // USB插入获取对应串口名称

DEV_BROADCAST_HDR dbhdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));

if (dbhdr.dbch_devicetype == DBT_DEVTYP_PORT)

{

string portName = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() + Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));

if (!cbPort.Items.Contains(portName))

{

cbPort.Items.Add(portName);

}

}

break;

}

}

base.WndProc(ref m);

}

你可能感兴趣的:(java监听usb拔插)