2009-10-13 67 views
3

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

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

微小的背景:应用程序应该感应插入USB设备(它),询问它并创建另一个NotifyIcon('设备图标'),以允许用户与该设备进行交互。上一段中提到的“主应用图标”允许用户与数据库交互并配置软件。

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

问题 当我从ManagementEventWatcher EventArrived事件实例化我的'设备类'时,问题就开始了。如果我在我的程序Main中实例化'设备类',那么当点击notifyicon时事件会正确启动。

所以,请,有人可以帮助我吗?

欢呼声,提前

马修

回答

2

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线程。有用吗?

+0

嗨马克 感谢您的快速回复! 我在这方面有点太新了,能够回答你的问题或理解建议。 有没有什么方法可以让你说'消息泵'?我确实有表格,但它们只是显示在我提到的ContextMenus的响应中。 您在第二句话中询问了哪个事件? 干杯 M – user188999 2009-10-13 11:38:05

+0

稍后回复 - 工作时间... – 2009-10-13 12:09:27

+0

谢谢马克。我的研究告诉我,我需要做一些交叉线程 - 我只能理解。关于代表和调用? hh – user188999 2009-10-13 12:24:26

0

马克,只是让你知道 -

我的工作了,我可以创建具有NotifyIcon的是在主线程中成员的类实例,然后使NotifyIcon的(一个或多个)可见,当USB设备( s)连接。

它需要一些调整,尽管因为NotifyIcon是在它首次被显示时创建的,所以我必须确保(在主线程中)将Visible设置为true,然后对每个设置为false,从而产生需要限制实例的数量。

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

解决方法。

(见回复您的意见)

+0

增加了一些想法 - 我希望它有帮助。 – 2009-10-15 11:34:14

1

所以答案是:

如果当你的NotifyIcon的可见的,你在主线程做的事件只会工作。所以Marc Gravell给出的代码就是解决方案。