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。
解决方法。
(见评论回复)
- 如何使用Action委托参数方法将win32应用程序中的c ++方法的地址传递给ac#方法
- 如何在C#中检测表单控件的变化?
- 使用NUnit在VS2012中调试而不抛出exception?
- 如何使用具有不可变值类型的protobuf-net?
- C#USING关键字 – 何时何地不使用它?
- 在.NET Core项目中找不到System.ServiceModel
- 来自Week和WeekYear的LocalDate
- 在Windowsapp store的TextBlock和PasswordBox中垂直和水平居中文本
- 是否可以作为应用程序进行身份validation而不是使用Facebook C#SDK进行身份validation?