我是新来的,有一个非常神秘的问题要开始。我是一名在英国的软件开发人员,有超过15年的经验,但在.Net中只开发了18个月。我的NotifyIcon鼠标事件没有触发!
我正在使用C#编写一个应用程序,该应用程序以NotifyIcon (“主应用程序图标”)开头,并在鼠标右键上显示ContextMenu。这很好: ContextMenu、窗体启动和鼠标单击事件触发。
一个小小的背景:应用程序应该感觉到一个usb‘设备’的插入(它确实),询问它并创建另一个NotifyIcon (“设备图标”),以允许用户与该设备进行交互。我在上一段中提到的“主应用程序图标”允许用户与数据库进行交互并配置软件。
为了封装这些设备交互功能,我构建了一个“设备类”,它包含设备NotifyIcon、ContextMenu、窗体、鼠标单击事件等,允许与设备交互。
问题当我从ManagementEventWatcher EventArrived事件实例化我的‘设备类’时,问题就开始了。如果我在我的程序Main中实例化了'device类‘,那么当我单击通知图标时,事件就会正确地触发。
所以,拜托,有人能帮我吗?
干杯,提前
马太福音
发布于 2009-10-13 11:15:24
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线程(如果需要的话)。有用吗?
发布于 2010-01-21 19:51:53
所以答案是:
只有当您在主线程中使NotifyIcon可见时,这些事件才能工作。所以,Marc给出的代码就是解决方案。
发布于 2009-10-15 10:13:37
马克,就为了让你知道-
我计算出可以在主线程中创建以NotifyIcon作为成员的类实例,然后在连接USB设备时使NotifyIcon(s)可见。
但是,它需要进行一些调整,因为NotifyIcon是在第一次显示时创建的,因此我必须确保(在主线程中)设置为true,然后为每个线程设置为false --这就需要限制实例的数量。
然后,当设备连接时,ManagementEventWatcher线程可以将可视属性设置为true。
一个解决办法。
(见对你评论的答复)
https://stackoverflow.com/questions/1559453
复制相似问题