【问题标题】:Not updating systray notifyicon dynamically?不动态更新系统托盘通知图标?
【发布时间】:2018-06-07 13:44:01
【问题描述】:

我有以下代码“应该”在现有的托盘图标上绘制 2,但运行时图标不会更新?我已将位图保存到文件中,并且它确实按预期在顶部绘制了 2,我是否需要以某种方式刷新托盘图标以使其更新,或者我是否以错误的方式进行此操作

t_Elapsed:

Graphics canvas;
Bitmap iconBitmap = new Bitmap(16, 16);
canvas = Graphics.FromImage(iconBitmap);

canvas.DrawIcon(Properties.Resources.SystemTrayApp, 0, 0);

StringFormat format = new StringFormat();
format.Alignment = StringAlignment.Center;

canvas.DrawString(
    "2",
    new Font("Calibri", 8, FontStyle.Bold),
    new SolidBrush(Color.FromArgb(40, 40, 40)),
    new RectangleF(0, 3, 16, 13),
    format
);

NotifyIcon ni;
ni = new NotifyIcon();
ni.Icon = Icon.FromHandle(iconBitmap.GetHicon());
ni.Visible = true;

t.Start();

这是最初生成 notifyicon 的代码...

namespace SystemTrayApp
{
class ProcessIcon : IDisposable
{
    NotifyIcon ni;

    public ProcessIcon()
    {
        ni = new NotifyIcon();
    }

    public void Display()
    {   
        ni.MouseClick += new MouseEventHandler(ni_MouseClick);
        ni.Icon = Resources.SystemTrayApp;
        ni.Text = "Auto Sort";
        ni.Visible = true;

        ni.ContextMenuStrip = new ContextMenus().Create();
    }

    public void Dispose()
    {
        ni.Dispose();
    }
}
}

这是调用初始 ProcessIcon 的主要部分。

static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        // Show the system tray icon.                   
        using (ProcessIcon pi = new ProcessIcon())
        {
            pi.Display();

            t = new System.Timers.Timer();
            t.AutoReset = false;
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
            t.Interval = 2000;
            t.Start();

            // Make sure the application runs!
            Application.Run();               
        }
    }

这个主要部分启动了您在第一部分中可以看到的计时器循环,我正在尝试更新托盘图标并失败(好吧,它正在按照建议在现有图标之外创建一个新图标)

定时器循环如何访问 pi 对象来更新图标?

谢谢

【问题讨论】:

  • 不释放宝贵的系统资源。 3…2…1…中的内存泄漏
  • 不清楚new NotifyIcon() 在这段代码中如何有效,或者为什么你现在看不到你有多个。当然,您打算更新现有的,代码中的其他地方应该有一个新的 NotifyIcon() 语句。您可以声明变量 static 以便于获取它。
  • 您应该在DrawString 之后处理canvas 以释放Graphics 对象
  • 添加了上面第一次创建 notifyicon 的初始代码

标签: c# notifyicon


【解决方案1】:

找到答案,我需要将计时器功能移动到创建托盘图标的同一类中,然后从那里启动计时器并能够按预期更新图标。还按照建议添加了处置:)

谢谢

【讨论】:

    猜你喜欢
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多