【问题标题】:NotifyIcon Events not firingNotifyIcon 事件未触发
【发布时间】:2009-10-13 10:44:36
【问题描述】:

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

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

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

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

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

那么,请问有人可以帮助我吗?

干杯,提前

马修

【问题讨论】:

    标签: c# event-handling notifyicon


    【解决方案1】:

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

    您在任何地方都有表格吗?还是带有消息循环的其他东西?我很想调用表单(使用 Control.Invoke),并要求 form 显示图标 - 从那时起它应该有一个活动的消息泵。


    抱歉耽搁了;阅读您的 cmets,听起来您已经有了广泛的解决方法。唯一的问题是跨线程问题;理想情况下,您会要求 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 线程进行线程切换(如果需要)。有什么用吗?

    【讨论】:

    • 嗨,马克感谢您的快速回复!我对此有点陌生,无法回答您的问题或理解建议。有什么办法可以让你说的“信息泵”?我确实有表格,但它们只显示在我提到的 ContextMenus 的响应中。你在第二句话中问的是哪个事件?干杯M
    • 谢谢马克。我的研究告诉我,我需要做一些跨线程——我只是明白。关于代表和调用的东西? hth
    • 马克,只是为了让你知道——我发现我可以在主线程中创建以 NotifyIcon 作为成员的类实例,然后在 USB 设备( s) 已连接。虽然它需要一些调整,因为 NotifyIcon 是在它第一次可见时创建的,所以我必须确保我将 Visible 设置为 true,然后为每个设置为 false。然后,ManagementEventWatcher 线程可以在设备连接时将 Visible 属性设置为 true。一种解决方法。
    • 我真的很想知道如何在主线程中实例化类(因此事件会触发),但如果您有时间提供帮助,请从 ManagementEventWatcher 线程开始?
    【解决方案2】:

    所以答案是:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      一种解决方法。

      (查看对您的 cmets 的回复)

      【讨论】:

      • 添加了一些想法 - 希望对您有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 2010-11-08
      • 2019-01-31
      相关资源
      最近更新 更多