我是新来的,开始时有一个非常神秘的问题。我是英国的软件开发人员,拥有超过15年的经验,但只在.Net开发了18个月。我的NotifyIcon鼠标事件没有被触发!
我正在使用C#编写一个以NotifyIcon('主app图标')开头的应用程序,并在鼠标右键单击时显示ContextMenu。这很好用:ContextMenu,表单启动和鼠标单击事件触发。
一小部分背景:应用程序应该感知usb'设备'(它确实)的插入,询问它并创建另一个NotifyIcon('设备图标')以允许用户与该设备交互。我在上一段中提到的“主应用程序图标”允许用户与数据库交互并配置软件。
为了封装这些设备交互功能,我构建了一个“设备类” 包含设备NotifyIcon,ContextMenu,表单,鼠标点击事件等,允许与设备进行交互。
问题 当我从ManagementEventWatcher EventArrived事件中实例化我的“设备类”时,问题就出现了。如果我在我的程序Main中实例化'device class',那么当我点击notifyicon时,事件会正确触发。
那么,拜托,有人可以帮助我吗?
提前干杯
马修
答案 0 :(得分:2)
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线程进行线程切换(如果需要)。有用吗?
答案 1 :(得分:1)
所以答案是:
只有当您使NotifyIcon可见时,才会在主线程中执行此操作。所以Marc Gravell给出的代码就是解决方案。
答案 2 :(得分:0)
我发现我可以创建在主线程中将NotifyIcon作为成员的类实例,然后在连接USB设备时使NotifyIcon可见。
它需要进行一些调整,因为NotifyIcon是在第一次显示时创建的,所以我必须确保(在主线程中)我将Visible设置为true然后将其设置为false - 从而产生需求用于限制实例的数量。
然后,当设备连接时,ManagementEventWatcher线程可以将Visible属性设置为true。
解决方法。
(参见对你评论的回复)