-
Notifications
You must be signed in to change notification settings - Fork 0
/
trayicon.cs
168 lines (140 loc) · 5.3 KB
/
trayicon.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
using System.Management;
public class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
ProcessStartInfo start = new ProcessStartInfo();
start.WindowStyle = ProcessWindowStyle.Hidden;
TrayIcon batteryIcon = new TrayIcon("temp");
TrayIcon memoryIcon = new TrayIcon("memory");
TrayIcon cpuIcon = new TrayIcon("cpu");
Application.Run();
}
class TrayIcon
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
static extern bool DestroyIcon(IntPtr handle);
private const string iconFont = "Segoe UI";
private const int iconFontSize = 14;
private NotifyIcon notifyIcon;
private ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature");
private Double temperature;
private String instanceName;
private PerformanceCounter pcc;
private string typeOfIcon;
private string stringToDisplay;
public TrayIcon(string _typeOfIcon)
{
temperature=0;
instanceName="";
typeOfIcon = _typeOfIcon;
ContextMenu contextMenu = new ContextMenu();
MenuItem menuItem = new MenuItem();
notifyIcon = new NotifyIcon();
// initialize contextMenu
contextMenu.MenuItems.AddRange(new MenuItem[] { menuItem });
// initialize menuItem
menuItem.Index = 0;
menuItem.Text = "E&xit";
menuItem.Click += new System.EventHandler(menuItem_Click);
notifyIcon.ContextMenu = contextMenu;
if (string.Equals(typeOfIcon, "memory"))
{
pcc = new PerformanceCounter("Pamięć", "Zadeklarowane bajty w użyciu (%)");
}
else if (string.Equals(typeOfIcon, "cpu"))
{
pcc = new PerformanceCounter("Procesor", "Czas procesora (%)", "_Total");
}
notifyIcon.Visible = true;
Timer timer = new Timer();
timer.Tick += new EventHandler(timer_Tick);
timer.Interval = 500; // in miliseconds
timer.Start();
}
private void timer_Tick(object sender, EventArgs e)
{
double val=0;
if (string.Equals(typeOfIcon, "temp"))
{
foreach (ManagementObject obj in searcher.Get())
{
temperature = Convert.ToDouble(obj["CurrentTemperature"].ToString());
// Convert the value to celsius degrees
temperature = (temperature - 2732) / 10.0;
instanceName = obj["InstanceName"].ToString();
}
val = temperature;
stringToDisplay = "Temp: " + temperature.ToString() + "C";
}
else if (string.Equals(typeOfIcon, "memory"))
{
val = Math.Round(pcc.NextValue());
stringToDisplay = "Mem: " + Math.Round(pcc.NextValue()).ToString() + "%";
}
else if (string.Equals(typeOfIcon, "cpu"))
{
val = Math.Round(pcc.NextValue());
stringToDisplay = "CPU: " + Math.Round(pcc.NextValue()).ToString() + "%";
}
Color[] colors = {Color.Red, Color.Orange, Color.Yellow, Color.Green, Color.Blue, Color.Purple, Color.Pink};
int interval = (int)Math.Floor(val / (100 / colors.Length));
Color bg_col = colors[interval % 7];
using (Bitmap bitmap = new Bitmap(DrawText(val.ToString(), new Font(iconFont, iconFontSize), bg_col)))
{
System.IntPtr intPtr = bitmap.GetHicon();
try
{
using (Icon icon = Icon.FromHandle(intPtr))
{
notifyIcon.Icon = icon;
notifyIcon.Text = stringToDisplay;
}
}
finally
{
DestroyIcon(intPtr);
}
}
}
private void menuItem_Click(object sender, EventArgs e)
{
notifyIcon.Visible = false;
notifyIcon.Dispose();
Application.Exit();
}
private Image DrawText(String text, Font font, Color backColor)
{
Color textColor = Color.FromArgb(backColor.ToArgb()^0xFFFFFF);
var textSize = GetImageSize(text, font);
Image image = new Bitmap((int) textSize.Width, (int) textSize.Height);
using (Graphics graphics = Graphics.FromImage(image))
{
// paint the background
graphics.Clear(backColor);
// create a brush for the text
using (Brush textBrush = new SolidBrush(textColor))
{
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
graphics.DrawString(text, font, textBrush, 0, 0);
graphics.Save();
}
}
return image;
}
private static SizeF GetImageSize(string text, Font font)
{
using (Image image = new Bitmap(1, 1))
using (Graphics graphics = Graphics.FromImage(image))
return graphics.MeasureString(text, font);
}
}
}