NotifyIcon События не запускаются

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

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

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

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

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

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

Ура, заранее

Мэтью

13.10.2009 10:44:36
3 ОТВЕТА

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;
    }
}

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

3
15.10.2009 11:33:57
Привет Марк Спасибо за быстрый ответ! Я слишком новичок в этом, чтобы отвечать на ваши вопросы или понимать предложение. Есть ли какой-то способ, которым я могу заставить вас «рассылать сообщения»? У меня есть формы, но они отображаются только в ответ на упомянутые мной ContextMenus. О каком событии вы спрашиваете во втором предложении? Приветствия M
user188999 13.10.2009 11:38:05
спасибо Марк Мое исследование говорит мне, что мне нужно сделать несколько потоков - что я только понимаю. Что-то о делегатах и ​​вызове? hth
user188999 13.10.2009 12:24:26
Марк, просто чтобы вы знали - я разработал, что я могу создать экземпляры класса, которые имеют NotifyIcon в качестве членов в главном потоке, а затем сделать NotifyIcon (s) видимым, когда USB-устройства подключены. Это потребовало некоторой корректировки, потому что NotifyIcon создается, когда он впервые становится видимым, поэтому я должен был убедиться, что я установил Visible в true, а затем в false для каждого. Затем поток ManagementEventWatcher может установить для свойства Visible значение true, когда устройство подключится. Обходной путь.
user188999 15.10.2009 09:54:25
Мне действительно интересно знать, как создать экземпляр класса в главном потоке (чтобы события запускались), но начну это с потока ManagementEventWatcher, если у вас было время помочь?
user188999 15.10.2009 09:55:00

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

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

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

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

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

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

0
15.10.2009 10:13:37
добавил несколько мыслей - надеюсь, это поможет.
Marc Gravell♦ 15.10.2009 11:34:14

Итак, ответ:

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

1
21.01.2010 19:51:53