【问题标题】:Notify icon does not show in tray C# winforms通知图标不显示在托盘 C# winforms 中
【发布时间】:2011-08-18 10:43:04
【问题描述】:

为什么当我启动 Windows 窗体时,我的通知图标没有显示在系统托盘中?
这就是我正在做的事情。
我有一个 Windows 服务,它启动我的托盘应用程序,它是一个 Windows 窗体应用程序(我正在使用模拟在当前用户的上下文中启动该应用程序)。 在托盘应用程序中,我正在启动一个包含通知图标的表单。
这里的问题是通知图标有时不会出现在系统托盘中,我无法找出原因。
在表单的 OnLoad 方法中,我将表单的可见属性设置为 false。 我也在做一些远程服务调用(比如ipc)。那是问题吗?
如何让我的通知图标始终出现在系统托盘中?
编辑:这是 OnLoad 函数的代码

protected override void OnLoad(System.EventArgs e)
{
    this.Visible = false;
    //Get some value from registry
    CheckForStealthMode();
    GetLoginType();
    bool GetProbeStatus = false;
    ServiceActivityInterface remoteMethods = null;
    do
    {
        try
        {
            remoteMethods = (ServiceActivityInterface)Activator.GetObject(typeof(ServiceActivityInterface), "tcp://localhost:18800/ServiceRemoting);
            ProbeStatus = remoteMethods.GetProbeStatus();
            GetProbeStatus = true;
        }
        catch (Exception exception)
        {
            GetProbeStatus = false;
            log.Error("Exception while getting the status of Probe:" + exception.Message);
        }
        finally
        {
            remoteMethods = null;
            if (!GetProbeStatus) 
            {
                Thread.Sleep(5000);
                log.Debug("Retrying to get the probe status.");
            }
        }
    } while (!GetProbeStatus);  
}

【问题讨论】:

  • 您能分享一下您的 OnLoad 方法中的代码(作为开始)吗?
  • 只是托盘图标未显示,还是其他任何内容无法按预期运行?您是否检查过 Windows 事件查看器以查看应用程序事件日志(甚至安全日志)中是否报告了任何内容?
  • @Ben Scott 我已经在问题中发布了代码。
  • @Jason Down 是的,只有托盘图标没有显示所有其他功能按预期工作。
  • 在旁注中,我建议用“Get”这个词定义大多数变量是一个坏主意,因为当你引用它时,它会读起来像一个方法调用,例如GetProbeStatus = true;

标签: c# winforms notifyicon


【解决方案1】:

查看您的OnLoad 方法,您有一个潜在的无限循环,如果抛出任何异常,则只能每 5 秒执行一次,并记录异常然后丢弃。当您Thread.Sleep 时,您正在阻止 UI 线程,并且很可能会停止显示通知图标。我会查看 Activator.GetObject 或 RPC GetProbeStatus 调用,并考虑将 RPC 代码移动到另一个线程以避免阻塞 UI。

【讨论】:

  • 是的,你是对的,RPC 阻塞了 UI 线程,我已移至新线程。但即使在那之后我也遇到了同样的问题。我刚刚通过将通知图标的可见属性设置为 false 然后再次设置为 true 找到了临时解决方案,这很奇怪,但对我有用。
【解决方案2】:

现在我建议在 Notify 图标代码或其他条件语句周围设置几个断点,以查找是否未调用某些内容。尝试找到一致的再现,以帮助您诊断正在发生的事情。我过去发生过一些奇怪的事情,其中​​最令人困惑的是与定时事件有关的事情

我还建议(如果它确实与不理想的 Thread.Sleep 方法相关,这可能会解决您的问题。用户只是得到一个冻结的 UI。使用一个计时器类并拿起滴答声或经过事件,以便用户可以继续,但您仍然会延迟。

【讨论】:

  • 嗯,好的,我仍然会继续使用断点视图,无论有没有这些,主要目标是建立一个复制,您可以重复相同的结果。这可能是您无法控制的错误,您需要破解或顺序错误的东西,或者只是代码中的问题。断点是我通常尝试建立的方式。
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2016-03-08
相关资源
最近更新 更多