Systray应用程序退出

时间:2012-06-27 21:26:00

标签: c# windows icons system-tray

我有一个简单的小型C#应用程序,用于更新系统托盘中的图标。我用它以图形方式显示CPU使用情况。该应用程序运行良好。我保持窗口隐藏,不要在任务栏中显示它,所以它不会妨碍。

我的问题是它会运行一段时间。经常几个小时。但它会神秘地退出。没有警告。没有。图标刚刚消失,程序不再运行。我已经在不同的条件下在调试器中测试了程序,所以我不认为是这样。有什么明显的东西我不见了吗?如果程序遇到错误并退出,如果表单被隐藏,我应该期待一条消息吗?是否有一些“保持活力”的消息或我需要处理的事情?

以下是相关的代码部分:

public Form1()
{
    InitializeComponent();

    trayIcon = new NotifyIcon();
    trayIcon.Text = "CPU Utilization";
    trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);

    trayIcon.Visible = true;

    update = new Thread(new ThreadStart(UpdateCPU));
    update.Start();
}

protected override void OnLoad(EventArgs e)
{
    Visible = false;
    ShowInTaskbar = false;

    base.OnLoad(e);
}

private void UpdateCPU()
{
    Bitmap bm = new Bitmap(32, 32);
    Graphics g = Graphics.FromImage(bm);

    while (true)
    {
        g.FillRectangle(new SolidBrush(c3), 17, 17, 15, 15);
        trayIcon.Icon = System.Drawing.Icon.FromHandle(bm.GetHicon());

        Thread.Sleep(1000);
    }
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

我建议你添加一个Unhandled Exception Handler

Global Exception Handling for winforms control

可能会抛出异常,导致程序退出。

然后,引入日志记录以记录Exception的内容。我个人更喜欢NLog

我有点惊讶你可以从非UI线程更新trayIcon而不会收到跨线程异常。

答案 1 :(得分:0)

documentation似乎同意Viktor Latypov的评论,你应该这样做:

Icon newIcon = Icon.FromHandle(bm.GetHicon());

trayIcon.Icon = newIcon;

DestroyIcon(newIcon.Handle);