Как получить, Включают и работают с уведомлениями об устройстве без формы окон

Я пытаюсь записать библиотеку классов, которая может поймать сообщения окон для уведомления меня, если устройство было присоединено или удалено. Обычно, в окна формируют приложение, я просто переопределил бы метод WndProc, но в этом случае нет метода WndProc. Есть ли иначе, я могу получить сообщения?

32
задан Hans Passant 17 August 2016 в 12:12
поделиться

1 ответ

Вам понадобится окно, это невозможно. Вот пример реализации. Реализуйте обработчик события для 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);
  }
}
40
ответ дан 27 November 2019 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: