首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NotifyIcon事件不触发

NotifyIcon事件不触发
EN

Stack Overflow用户
提问于 2009-10-13 10:44:36
回答 3查看 2.8K关注 0票数 4

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

我正在使用C#编写一个应用程序,该应用程序以NotifyIcon (“主应用程序图标”)开头,并在鼠标右键上显示ContextMenu。这很好: ContextMenu、窗体启动和鼠标单击事件触发。

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

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

问题当我从ManagementEventWatcher EventArrived事件实例化我的‘设备类’时,问题就开始了。如果我在我的程序Main中实例化了'device类‘,那么当我单击通知图标时,事件就会正确地触发。

所以,拜托,有人能帮我吗?

干杯,提前

马太福音

EN

回答 3

Stack Overflow用户

发布于 2009-10-13 11:15:24

IIRC,事件使用(而不是WaitForNextEvent)工作异步。我想知道事件是在哪个线程上启动的。我想知道是否没有为您的图标提供消息泵服务。

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

很抱歉耽误了你的时间,读了你的评论,听起来你已经找到了解决办法。唯一的问题是跨线程问题;理想情况下,您应该要求UI对UI线程进行这样的更改;例如,如果您有一个Form (拥有图标)-添加到您的表单类中:

代码语言:javascript
复制
// 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线程(如果需要的话)。有用吗?

票数 3
EN

Stack Overflow用户

发布于 2010-01-21 19:51:53

所以答案是:

只有当您在主线程中使NotifyIcon可见时,这些事件才能工作。所以,Marc给出的代码就是解决方案。

票数 1
EN

Stack Overflow用户

发布于 2009-10-15 10:13:37

马克,就为了让你知道-

我计算出可以在主线程中创建以NotifyIcon作为成员的类实例,然后在连接USB设备时使NotifyIcon(s)可见。

但是,它需要进行一些调整,因为NotifyIcon是在第一次显示时创建的,因此我必须确保(在主线程中)设置为true,然后为每个线程设置为false --这就需要限制实例的数量。

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

一个解决办法。

(见对你评论的答复)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1559453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档