NotifyIcon事件未触发

我是新来的,开始时有一个非常神秘的问题。 我是英国的软件开发人员,拥有超过15年的经验,但只在.Net开发了18个月。 我的NotifyIcon鼠标事件没有被触发!

我正在使用C#编写一个以NotifyIcon(’主app图标’)开头的应用程序,并在鼠标右键单击时显示ContextMenu。 这很好用:ContextMenu,表单启动和鼠标单击事件触发。

一小部分背景:应用程序应该感知usb’设备’(它确实)的插入,询问它并创建另一个NotifyIcon(’设备图标’)以允许用户与该设备交互。 我之前段落中提到的“主应用程序图标”允许用户与数据库交互并配置软件。

为了封装这些设备交互function,我构建了一个“设备类”,其中包含设备NotifyIcon,ContextMenu,表单,鼠标单击事件等,允许与设备进行交互。

问题当我从ManagementEventWatcher EventArrived事件中实例化我的“设备类”时,问题就出现了。 如果我在我的程序Main中实例化’device class’,那么当我点击notifyicon时,事件会正确触发。

那么,拜托,有人能帮帮我吗?

干杯,提前

马修

IIRC, 事件使用(而不是WaitForNextEvent )工作异步。 我很想知道该事件正在引发什么线程。 我想知道你的图标是否没有消息泵服务消息。

你有办法吗? 或者带有消息循环的其他内容? 我很想调用表单(使用Control.Invoke ),并要求表单显示图标 – 从那时起它应该有一个活动的消息泵。


抱歉耽搁了; 阅读你的评论,听起来你已经广泛得到了解决方法。 唯一的问题是交叉线程问题; 理想情况下,您会要求UI 在UI线程上进行此类更改; 例如,如果您有一个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; } } 

这会对UI线程进行线程切换(如果需要)。 有用吗?

所以答案是:

仅当您使NotifyIcon可见时,事件才会起作用,您可以在主线程中执行此操作。 所以Marc Gravell给出的代码就是解决方案。

马克,只是为了让你知道 –

我发现我可以创建在主线程中将NotifyIcon作为成员的类实例,然后在连接USB设备时使NotifyIcon可见。

它需要一些调整,因为NotifyIcon是在第一次显示时创建的,所以我必须确保(在主线程中)我将Visible设置为true然后将其设置为false – 这导致需要限制实例数。

然后,当设备连接时,ManagementEventWatcher线程可以将Visible属性设置为true。

解决方法。

(见评论回复)