NotifyIcon События не запускаются - PullRequest
4 голосов
/ 13 октября 2009

Я новичок здесь, и у меня действительно загадочная проблема. Я являюсь разработчиком программного обеспечения в Великобритании и имею более чем 15-летний опыт работы, но только 18 месяцев работаю в .Net. Мои события мыши NotifyIcon не запускаются!

Я использую C # для написания приложения, которое запускается как NotifyIcon («значок основного приложения») и отображает ContextMenu при щелчке правой кнопкой мыши. Это прекрасно работает: ContextMenu, запуск форм и срабатывание событий щелчка мыши.

Небольшой фон: приложение должно воспринимать вставку «устройства» usb (оно это делает), запрашивать его и создавать другой NotifyIcon («значок устройства»), чтобы позволить пользователю взаимодействовать с этим устройством. «Значок основного приложения», упомянутый в моем предыдущем абзаце, позволяет пользователю взаимодействовать с базой данных и настраивать программное обеспечение.

Чтобы инкапсулировать эти функции взаимодействия с устройствами, я создал «класс устройств», который содержит устройство NotifyIcon, ContextMenu, формы, события щелчка мыши и т. д., которые позволяют взаимодействовать с устройством.

Проблема Проблема начинается, когда я создаю экземпляр своего «класса устройств» из события ManagementEventWatcher EventArrived. Если я создаю экземпляр «класса устройств» в моей программе Main, то события запускаются правильно, когда я нажимаю на уведомление.

Так, пожалуйста, кто-нибудь может мне помочь?

Приветствия, заранее

Мэтью

Ответы [ 3 ]

3 голосов
/ 13 октября 2009

IIRC, использование события (вместо WaitForNextEvent) работает асинхронно. Мне было бы интересно узнать, на какой ветке происходит событие. Интересно, нет ли сообщения, обслуживающего сообщения, для вашего значка.

У вас есть где-нибудь форма? Или что-то еще с циклом сообщений? Я бы соблазнился позвонить в форму (используя Control.Invoke) и попросить форму показать значок - с тех пор у него должен быть активный насос сообщений.


Извините за задержку; читая ваши комментарии, кажется, что у вас есть обходной путь. Единственное, что надо - это перекрестные проблемы; в идеале вы должны попросить пользовательский интерфейс внести такое изменение в потоке пользовательского интерфейса ; например, если у вас есть Form, бегающий вокруг (владеющий значком) - добавьте в свой класс формы:

// not a property, as there is no need to add a complex x-thread "get"
public void SetIconVisible(bool isVisible) {
    if(this.InvokeRequired) {
        this.Invoke((MethodInvoker) delegate {
            myIcon.Visible = isVisible;
        });
    } else {
        myIcon.Visible = isVisible;
    }
}

Это делает переключение потока (если необходимо) потоком пользовательского интерфейса. Любое использование?

1 голос
/ 21 января 2010

Итак, ответ:

События будут работать только в том случае, если, когда вы делаете NotifyIcon видимым, вы делаете это в главном потоке. Таким образом, код, данный Марком Гравеллом, является решением.

0 голосов
/ 15 октября 2009

Марк, просто чтобы вы знали -

Я понял, что могу создать экземпляры класса, которые имеют NotifyIcon в качестве членов в главном потоке, а затем сделать NotifyIcon (s) видимым, когда подключено USB-устройство.

Требовалась небольшая корректировка, потому что NotifyIcon создается при первом его отображении, поэтому я должен был убедиться, что (в главном потоке) я установил для Visible значение true, а затем false для каждого - что порождает необходимость для ограничения количества экземпляров.

Поток ManagementEventWatcher может установить для свойства Visible значение true, когда устройство подключается.

Обходной путь.

(см. Ответы на ваши комментарии)

...