我几乎准备好了我的程序,我认为它运行得非常顺利。我只是碰巧意识到,在检查 usb-arrival 时,很多“对象引用未设置为对象的实例”。在阅读应该与 winmsg 一起到达的结构时向我抛出。我在插入和拔出 USB 时收到 3-4 个 Nullreference 错误。
我究竟做错了什么?
public partial class Form1 : Form
{
private const int WM_DEVICECHANGE = 0x0219;
private const int DBT_DEVICEARRIVAL = 0x8000;
private const int DBT_DEVICEREMOVALCOMPLETE = 0x8004;
private const int DBT_DEVTYPVOLUME = 0x00000002;
public Form1()
{
InitializeComponent();
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_DEVICECHANGE)
{
try
{
Debug.WriteLine("trying");
DEV_BROADCAST_VOLUME vol = (DEV_BROADCAST_VOLUME)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME));
if ((m.WParam.ToInt32() == DBT_DEVICEARRIVAL) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
{
Debug.WriteLine("usb in");
//NewStickArrived(DriveMaskToLetter(vol.dbcv_unitmask).ToString());
}
if ((m.WParam.ToInt32() == DBT_DEVICEREMOVALCOMPLETE) && (vol.dbcv_devicetype == DBT_DEVTYPVOLUME))
{
Debug.WriteLine("usb out");
}
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
}
}
base.WndProc(ref m);
}
[StructLayout(LayoutKind.Sequential)] //Same layout in mem
public struct DEV_BROADCAST_VOLUME
{
public int dbcv_size;
public int dbcv_devicetype;
public int dbcv_reserved;
public int dbcv_unitmask;
}
}
}
您还需要以下内容来尝试此示例:
using System.Diagnostics;
using System.Runtime.InteropServices;
我想它可能是在 1. 我对结构做错了,因为我对它们还不太了解,或者 2. 有时这个“[...]Marshal.PtrToStructure(m.LParam[...] “不适合结构...
谢谢