托盘C#winforms中不显示通知图标

时间:2011-08-18 10:43:04

标签: c# winforms notifyicon

为什么我启动Windows窗体时系统托盘中没有显示通知图标? 这就是我在做什么 我有一个Windows服务启动我的托盘应用程序,这是一个Windows窗体应用程序(我正在使用模拟在当前用户的上下文中启动该应用程序)。 在托盘应用程序中,我正在启动一个包含通知图标的表单。
这里的问题是有时通知图标没有出现在系统托盘中,我无法找出原因。
在窗体的OnLoad方法中,我将窗体的visible属性设置为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);  
}

2 个答案:

答案 0 :(得分:0)

现在我建议在Notify图标代码或其他条件语句周围找几个断点来查找是否有东西未被调用。尝试找到一致的复制品,以帮助您诊断正在发生的事情。我过去曾经有过一些奇怪的事情,其中​​最混乱的是一个与定时事件有关的事件

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

答案 1 :(得分:0)

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