دسته بندی مقالات
- بیشتر -محصولات
- بیشتر -آخرین مقالات
- بیشتر --
کنترل Notify Icon در سی شارپ
1404/04/20 -
رمزنگاری نامتقارن Asymmetric در SQL Server
1404/04/18 -
کنترل MenuStrip در سی شارپ
1404/04/17 -
قفل گذاری روی اطلاعات در پایگاه داده SQL
1404/04/10 -
خروج کاربر غیرفعال در ASP.NET Core
1404/04/08 -
مفهوم ListView در سیشارپ
1404/04/07
کنترل Notify Icon در سی شارپ

مفهوم Notify Icon در سی شارپ چیست؟
NotifyIcon یک کنترل گرافیکی در Windows Forms است که اجازه میدهد آیکونی در System Tray ویندوز (کنار ساعت) نمایش داده شود.
این کنترل برای اطلاعرسانی، مدیریت وضعیت برنامه و تعامل ساده با کاربر بدون نیاز به باز بودن پنجره اصلی بسیار مفید است.
کاربردهای رایج Notify Icon
نمایش پیامهای اطلاعرسانی (Balloon Tip)
اجرای برنامه در پسزمینه بدون نمایش فرم اصلی
نمایش منوی راستکلیک با امکانات مختلف (Context Menu)
ایجاد Notify Icon در فرم
برای استفاده از NotifyIcon در سی شارپ، مراحل زیر را دنبال کنید:
1. اضافه کردن NotifyIcon به فرم
از طریق Designer یا کد:
NotifyIcon notifyIcon = new NotifyIcon();
notifyIcon.Icon = SystemIcons.Information; // یا آیکون دلخواه
notifyIcon.Text = "برنامه در حال اجراست";
notifyIcon.Visible = true;
2. افزودن منوی راستکلیک (اختیاری)
ContextMenuStrip menu = new ContextMenuStrip();
menu.Items.Add("نمایش برنامه", null, ShowApp);
menu.Items.Add("خروج", null, ExitApp);
notifyIcon.ContextMenuStrip = menu;
3. نمایش پیام Balloon Tip
notifyIcon.BalloonTipTitle = "اطلاع رسانی";
notifyIcon.BalloonTipText = "برنامه به صورت مخفی در حال اجراست.";
notifyIcon.ShowBalloonTip(3000); // نمایش به مدت 3 ثانیه
مثال های پروژه محور Notify Icon
مثال 1 : در این مثال، برنامهای میسازیم که با بستن فرم، از سیستم خارج نمیشود، بلکه در System Tray باقی میماند.
فرم Form1:
public partial class Form1 : Form
{
NotifyIcon trayIcon;
public Form1()
{
InitializeComponent();
InitTrayIcon();
}
private void InitTrayIcon()
{
trayIcon = new NotifyIcon();
trayIcon.Icon = SystemIcons.Application;
trayIcon.Text = "برنامهی من";
trayIcon.Visible = true;
ContextMenuStrip menu = new ContextMenuStrip();
menu.Items.Add("باز کردن", null, (s, e) => { this.Show(); this.WindowState = FormWindowState.Normal; });
menu.Items.Add("خروج", null, (s, e) => { trayIcon.Visible = false; Application.Exit(); });
trayIcon.ContextMenuStrip = menu;
trayIcon.BalloonTipTitle = "در حال اجرا";
trayIcon.BalloonTipText = "برنامه در پسزمینه در حال اجراست.";
trayIcon.ShowBalloonTip(2000);
trayIcon.DoubleClick += (s, e) =>
{
this.Show();
this.WindowState = FormWindowState.Normal;
};
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
if (this.WindowState == FormWindowState.Minimized)
{
this.Hide();
}
}
}
مثال 2 : برنامهای بسازید که هنگام راستکلیک روی آیکون در Tray، یک منوی با گزینههای "توقف موقت"، "ادامه"، و "خروج" داشته باشد.
حل : این پروژه رو به صورت کد نویسی براتون حل اش میکنم.
این برنامه یک NotifyIcon در System Tray ویندوز نمایش میدهد که با راستکلیک روی آن، یک منو شامل گزینههای زیر ظاهر میشود:
✅ توقف موقت: یک فرآیند یا تایمر فرضی را متوقف میکند.
▶️ ادامه: فرآیند را از سر میگیرد.
❌ خروج: برنامه را میبندد.
🧠 ایده کلی تمرین:
برای شبیهسازی وضعیت "در حال اجرا" و "توقف"، از یک Timer در فرم استفاده میکنیم. این تایمر هر ثانیه پیامی در Console یا Label چاپ میکند. با گزینه "توقف موقت" تایمر متوقف میشود و با "ادامه" مجدداً فعال خواهد شد.
✅ کد کامل Form1.cs
using System;
using System.Drawing;
using System.Windows.Forms;
namespace TrayApp
{
public partial class Form1 : Form
{
private NotifyIcon trayIcon;
private ContextMenuStrip trayMenu;
private ToolStripMenuItem pauseItem;
private ToolStripMenuItem resumeItem;
private Timer timer;
public Form1()
{
InitializeComponent();
InitializeTrayApp();
}
private void InitializeTrayApp()
{
// 1. تعریف تایمر شبیهساز فرآیند
timer = new Timer();
timer.Interval = 1000; // هر ثانیه
timer.Tick += Timer_Tick;
timer.Start();
// 2. منوی راستکلیک
trayMenu = new ContextMenuStrip();
pauseItem = new ToolStripMenuItem("توقف موقت", null, PauseProcess);
resumeItem = new ToolStripMenuItem("ادامه", null, ResumeProcess);
resumeItem.Enabled = false; // چون اول تایمر فعاله، ادامه غیرفعاله
trayMenu.Items.Add(pauseItem);
trayMenu.Items.Add(resumeItem);
trayMenu.Items.Add(new ToolStripSeparator());
trayMenu.Items.Add("خروج", null, ExitApp);
// 3. Notify Icon
trayIcon = new NotifyIcon();
trayIcon.Text = "وضعیت: در حال اجرا";
trayIcon.Icon = SystemIcons.Information;
trayIcon.ContextMenuStrip = trayMenu;
trayIcon.Visible = true;
trayIcon.BalloonTipTitle = "برنامه شروع شد";
trayIcon.BalloonTipText = "در حال اجرای فرآیند...";
trayIcon.ShowBalloonTip(2000);
trayIcon.DoubleClick += (s, e) =>
{
this.Show();
this.WindowState = FormWindowState.Normal;
};
}
private void Timer_Tick(object sender, EventArgs e)
{
Console.WriteLine("در حال اجرا: " + DateTime.Now.ToLongTimeString());
}
private void PauseProcess(object sender, EventArgs e)
{
timer.Stop();
trayIcon.BalloonTipTitle = "توقف موقت";
trayIcon.BalloonTipText = "فرآیند متوقف شد.";
trayIcon.ShowBalloonTip(1000);
pauseItem.Enabled = false;
resumeItem.Enabled = true;
trayIcon.Text = "وضعیت: متوقف";
}
private void ResumeProcess(object sender, EventArgs e)
{
timer.Start();
trayIcon.BalloonTipTitle = "ادامه فرآیند";
trayIcon.BalloonTipText = "فرآیند از سر گرفته شد.";
trayIcon.ShowBalloonTip(1000);
pauseItem.Enabled = true;
resumeItem.Enabled = false;
trayIcon.Text = "وضعیت: در حال اجرا";
}
private void ExitApp(object sender, EventArgs e)
{
trayIcon.Visible = false;
Application.Exit();
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
if (this.WindowState == FormWindowState.Minimized)
this.Hide();
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
trayIcon.Dispose();
timer.Dispose();
base.OnFormClosing(e);
}
}
}
آیا به دنبال یک فرصت عالی برای یادگیری برنامهنویسی هستید؟ 🚀
با دوره آموزشی سیشارپ ما، شما میتوانید مهارتهای خود را به سطح جدیدی ارتقا دهید! این دوره بهطور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامهنویسی سیشارپ پیش بروید.
👨🏫 چرا دوره ما را انتخاب کنید؟
- محتوای جامع و عملی: با پروژههای واقعی و تمرینات عملی، یادگیری را به تجربهای جذاب تبدیل کنید.
- مدرس مجرب: از تجربه و دانش مدرس حرفهای بهرهمند شوید که شما را در هر مرحله از یادگیری راهنمایی میکنند.
- پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
- دسترسی مادامالعمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، میتوانید به آن مراجعه کنید.
💡 فرصت را از دست ندهید!
بایادگیری سیشارپ، میتوانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژههای جذاب و چالشبرانگیز شرکت کنید.
همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آیندهای روشنتر بردارید!
شرکت در دوره آموزش برنامه نویسی سی شارپ
مثال 3: برنامهای طراحی کنید که با دوبار کلیک روی آیکون در System Tray، یک فرم تنظیمات (Settings) باز شود و کاربر بتواند مثلاً رنگ پسزمینه فرم را انتخاب کند.
حل : این مثال را با Desiner یا حالت ویزارد فرم حل میکنیم.
🎯 هدف:
نمایش فرم جدید با یک بار کلیک روی آیکون Tray.
فرم تنظیمات شامل انتخاب رنگ پسزمینه (یا سایر تنظیمات ساده) باشد.
✅ پیادهسازی
مرحله ۱: ساخت فرم تنظیمات در Visual Studio:
روی پروژه راستکلیک کن → Add → Windows Form → نام آن را Form1.cs بگذار.
دو شی notifyIcon و timer را روی فرم قرار دهید و طبق عکس های زیر تنظیمات زیر رو اعمال کنید.
کد های زیر را در رویداد های مورد نظر بنویسید.
public partial class Form1 : Form
{
private ContextMenuStrip trayMenu;
public Form1()
{
InitializeComponent();
InitializeTrayIcon();
}
private void InitializeTrayIcon()
{
trayMenu = new ContextMenuStrip();
trayMenu.Items.Add("خروج", null, (s, e) => ExitApplication());
notifyIcon1.Icon = SystemIcons.Application;
notifyIcon1.ContextMenuStrip = trayMenu;
notifyIcon1.ShowBalloonTip(3000);
timer1.Tick += (s, e) => Console.WriteLine("در حال اجرا...");
timer1.Start();
}
private void ExitApplication()
{
notifyIcon1.Visible = false;
Application.Exit();
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
notifyIcon1.Dispose();
timer1.Dispose();
base.OnFormClosing(e);
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
if (WindowState == FormWindowState.Minimized)
this.Hide();
}
private void notifyIcon1_BalloonTipClicked(object sender, EventArgs e)
{
using (SettingsForm settingsForm = new SettingsForm())
{
if (settingsForm.ShowDialog() == DialogResult.OK)
{
this.BackColor = settingsForm.SelectedColor;
}
}
}
}
روی پروژه راستکلیک کن → Add → Windows Form → نام آن را SettingsForm.cs بگذار.
در فرم تنظیمات، یک شی Button hqhti ld;kdl و کنترل ColorDialog با کد نویسی اضافه میکنیم
public partial class SettingsForm : Form
{
public SettingsForm()
{
InitializeComponent();
}
public Color SelectedColor { get; private set; } = SystemColors.Control;
private void button1_Click_1(object sender, EventArgs e)
{
using (ColorDialog colorDialog = new ColorDialog())
{
if (colorDialog.ShowDialog() == DialogResult.OK)
{
SelectedColor = colorDialog.Color;
this.DialogResult = DialogResult.OK;
this.Close();
}
}
}
}
نکات مهم درباره استفاده از Notify Icon
حتماً ویژگی Visible را به true تنظیم کنید تا آیکون در System Tray دیده شود.
از آیکونهای مناسب با اندازه 16x16 استفاده کنید تا ظاهر مناسبی داشته باشد.
از Dispose کردن NotifyIcon هنگام خروج از برنامه غافل نشوید.
برای جلوگیری از بسته شدن کامل برنامه هنگام کلیک روی × فرم، آن را ()Hide کنید.
سوالات پرتکرار (FAQ)
1. آیا میتوان چند NotifyIcon در یک فرم داشت؟
بله، ولی معمولاً برای سادگی UX از یک NotifyIcon استفاده میشود.
2. آیا NotifyIcon فقط در فرمهای ویندوزی (WinForms) کاربرد دارد؟
بله، این کنترل برای Windows Forms طراحی شده است و در WPF یا دیگر پلتفرمها باید از روشهای دیگر استفاده شود.
3. چرا Balloon Tip نمایش داده نمیشود؟
برخی تنظیمات ویندوز یا آنتیویروسها ممکن است آن را مسدود کنند. همچنین مطمئن شوید مقدار BalloonTipText و BalloonTipTitle مقدار دارند و Visible=true باشد.
جمعبندی مبحث NotifyIcon
در این مقاله، با مفهوم Notify Icon در سی شارپ آشنا شدیم و یاد گرفتیم چگونه از آن برای اجرای برنامه در پسزمینه، اطلاعرسانی به کاربر و ایجاد منوی راستکلیک استفاده کنیم.
این قابلیت برای ساخت برنامههای حرفهای، ساده و کاربرپسند بسیار مهم است.
دوره های مرتبط

آموزش برنامه نویسی سی شارپ
زبان شی گرایی حرفه ای سی شارپ یک زبان قدرتمند برای طراحی نرم افزار به شمار میرود.