不动态更新系统托盘通知图标?
Not updating systray notifyicon dynamically?
我有以下代码 "should" 在现有的托盘图标上绘制一个 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 对象来更新图标?
谢谢
找到答案,我需要将计时器功能移动到创建托盘图标的同一 class 中,然后从那里启动计时器并能够按预期更新图标。还按照建议添加了 dispose :)
谢谢
我有以下代码 "should" 在现有的托盘图标上绘制一个 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 对象来更新图标?
谢谢
找到答案,我需要将计时器功能移动到创建托盘图标的同一 class 中,然后从那里启动计时器并能够按预期更新图标。还按照建议添加了 dispose :)
谢谢