通知图标不显示在托盘c# winforms

本文关键字:winforms 图标 显示 通知 | 更新日期: 2023-09-27 18:05:53

为什么当我启动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);  
}

通知图标不显示在托盘c# winforms

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

现在,我建议在Notify图标代码或其他条件语句周围设置一些断点,以查找是否未调用某些内容。试着找到一个一致的复制来帮助你诊断到底发生了什么。我过去发生过一些奇怪的事情,其中最令人困惑的是与时间事件有关的事情。

我也会建议(这可能会解决你的问题,如果它确实涉及线程。这种睡眠方法并不理想。用户只会得到一个冻结的UI。使用计时器类之一并拾取tick或elapsed事件,以便用户可以继续,但您仍然可以获得延迟。