我正在尝试编写一个可以捕获Windows消息的类库,以通知我是否已连接或卸下设备。通常,在Windows窗体应用程序中,我将重写WndProc方法,但在这种情况下没有WndProc方法。我还有另一种获取消息的方式吗?
您将需要一个窗口,无法解决。这是一个示例实现。为DeviceChangeNotifier.DeviceNotify事件实现事件处理程序以获取通知。在程序开始时调用DeviceChangeNotifier.Start()方法。在程序末尾调用DeviceChangeNotifier.Stop()。请注意,DeviceNotify事件是在后台线程上引发的,请确保根据需要锁定以保持代码线程安全。
using System; using System.Windows.Forms; using System.Threading; class DeviceChangeNotifier : Form { public delegate void DeviceNotifyDelegate(Message msg); public static event DeviceNotifyDelegate DeviceNotify; private static DeviceChangeNotifier mInstance; public static void Start() { Thread t = new Thread(runForm); t.SetApartmentState(ApartmentState.STA); t.IsBackground = true; t.Start(); } public static void Stop() { if (mInstance == null) throw new InvalidOperationException("Notifier not started"); DeviceNotify = null; mInstance.Invoke(new MethodInvoker(mInstance.endForm)); } private static void runForm() { Application.Run(new DeviceChangeNotifier()); } private void endForm() { this.Close(); } protected override void SetVisibleCore(bool value) { // Prevent window getting visible if (mInstance == null) CreateHandle(); mInstance = this; value = false; base.SetVisibleCore(value); } protected override void WndProc(ref Message m) { // Trap WM_DEVICECHANGE if (m.Msg == 0x219) { DeviceNotifyDelegate handler = DeviceNotify; if (handler != null) handler(m); } base.WndProc(ref m); } }