4

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

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

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

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

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

所以,拜托,有人可以帮助我吗?

干杯,提前

马修

4

3 回答 3

3

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 线程进行线程切换(如果需要)。有什么用?

于 2009-10-13T11:15:24.203 回答
1

所以答案是:

仅当您使 NotifyIcon 可见时,事件才会起作用,您在主线程中执行此操作。所以 Marc Gravell 给出的代码就是解决方案。

于 2010-01-21T19:51:53.147 回答
0

马克,只是为了让你知道——

我发现我可以在主线程中创建具有 NotifyIcon 作为成员的类实例,然后在连接 USB 设备时使 NotifyIcon 可见。

虽然它需要一些调整,因为 NotifyIcon 是在它第一次可见时创建的,所以我必须确保(在主线程中)我将 Visible 设置为 true 然后为每个设置为 false - 从而需要限制实例数。

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

一种解决方法。

(请参阅对您的评论的回复)

于 2009-10-15T10:13:37.370 回答