C#, динамическая NotifyIcon, иконка в области уведомления
Давно посматривал на всякие приложения типа Process Explorer или Aida, которые могли создавать в трее иконки, что-нибудь динамически отображающие. Например, Process Explorer может показывать график загрузки ЦП:

Решил попробовать сделать что-то подобное. Оказывается, ничего сверхъестественного не было. Не стал пытаться изобразить график, сделал динамическое отображение заданного текста на иконке.
1. В приложение Windows Forms надо добавить, собственно,
NotifyIcon. Пусть будет с именем niMain.2. Иконка в трее должна быть размером 16x16, заведем соответствующие переменные:
int iwidth = 16; int iheight = 16;3. Потребуется строковая переменная, хранящая отрисовываемый текст, объект
Font и объект Bitmap, который будет хранить динамически отрисовываемое изображениеstring DSt = "";
Font fnt = null;
Bitmap bitm = null;4. В MSDN настоятельно рекомендуют после программного создания иконки, удалять ее с помощью функции
DestroyIcon из user32.dll, для предотвращения утечки памяти. Не буду отступать от рекомендаций MSDN, и функцию экспортирую:[System.Runtime.InteropServices.DllImport("user32.dll",
CharSet = System.Runtime.InteropServices.CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);5. Создаем нужный
Font и пустой Bitmap необходимого размера:private void frmTest_Load(object sender, EventArgs e)
{
fnt = new Font("Courier new", 8, FontStyle.Bold);
bitm = new Bitmap(iwidth, iheight);
}6. Отрисовываем изображение:
- Создаем объект
Graphics, который будет заниматься отрисовкой. Объект Graphics можно получить для определенного ранее Bitmap'а:Graphics graph = Graphics.FromImage(bitm);- Рисуем фон (черный квадрат):
graph.FillRectangle(Brushes.Black, 0, 0, iwidth, iheight);- И текст:
graph.DrawString(DSt,fnt,Brushes.Lime, new Point(0,2));7. Осталось сделать из объекта
Bitmap объект Icon и отдать его контролу NotifyIcon- Получаем handle иконки:
IntPtr hIcon = bitm.GetHicon();- Получаем иконку, и отдаем ее
NotifyIcon:System.Drawing.Icon niicon = System.Drawing.Icon.FromHandle(hIcon);
niTest.Icon = niicon;- Теперь можно уничтожить иконку, т.к в объекте
NotifyIcon будет отдельная копия иконки:DestroyIcon(niicon.Handle);ФАНФАРЫ!


Пример на GitHub
Bitmap.GetHicon()
Create Graphics from an Image Object
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2018/05/17/c-di