Что мне нужно сделать, чтобы приложение Windows Forms запускалось в системном лотке?
Не приложение, которое может свести к минимуму лоток, но тот, который существует только в лотке, с не более чем значком, подсказкой и меню "правой кнопкой мыши".
Что мне нужно сделать, чтобы приложение Windows Forms запускалось в системном лотке?
Не приложение, которое может свести к минимуму лоток, но тот, который существует только в лотке, с не более чем значком, подсказкой и меню "правой кнопкой мыши".
Основной ответ на использование NotifyIcon верен, но, как и многие другие,.NET, существует множество тонкостей, связанных с этим. Учебное пособие, упомянутое Брэдом, дает хорошее представление о самых основах, но не касается ни одного из них:
У меня только что была опубликована статья на Simple-Talk.com, которая затрагивает эти моменты и многое другое, предоставляя фреймворк платформы лотка, который вы можете использовать сразу, а также полное приложение для примера в реальном мире, чтобы показать все на практике. См. Создание лотков в .NET: Практическое руководство, опубликованное в ноябре 2010 г.
Проект проекта кода Создание приложения Tasktray дает очень простое объяснение и пример создания приложения, которое существует только в системном лотке.
В основном измените строку Application.Run(new Form1());
в Program.cs
, чтобы вместо этого запустить класс, наследующий от ApplicationContext
, и иметь конструктор для этого класса инициализировать NotifyIcon
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyCustomApplicationContext());
}
}
public class MyCustomApplicationContext : ApplicationContext
{
private NotifyIcon trayIcon;
public MyCustomApplicationContext ()
{
// Initialize Tray Icon
trayIcon = new NotifyIcon()
{
Icon = Resources.AppIcon,
ContextMenu = new ContextMenu(new MenuItem[] {
new MenuItem("Exit", Exit)
}),
Visible = true
};
}
void Exit(object sender, EventArgs e)
{
// Hide tray icon, otherwise it will remain shown until user mouses over it
trayIcon.Visible = false;
Application.Exit();
}
}
Как говорит mat1t - вам нужно добавить NotifyIcon к вашему приложению, а затем использовать что-то вроде следующего кода для установки всплывающей подсказки и контекстного меню:
this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));
Этот код показывает только значок в системном лотке:
this.notifyIcon.Visible = true; // Shows the notify icon in the system tray
При наличии формы (по какой-либо причине) потребуется следующее:
this.ShowInTaskbar = false; // Removes the application from the taskbar
Hide();
Щелчок правой кнопкой мыши, чтобы получить контекстное меню, обрабатывается автоматически, но если вы хотите сделать какое-то действие по левому клику, вам нужно будет добавить обработчик Click:
private void notifyIcon_Click(object sender, EventArgs e)
{
var eventArgs = e as MouseEventArgs;
switch (eventArgs.Button)
{
// Left click to reactivate
case MouseButtons.Left:
// Do your stuff
break;
}
}
Я написал приложение для подносов с .NET 1.1, и мне не нужна форма.
Прежде всего, установите объект запуска проекта как Sub Main
, определенный в модуле.
Затем программно создайте компоненты: NotifyIcon
и ContextMenu
.
Обязательно включите MenuItem
"Выход" или подобное.
Привяжите ContextMenu
к NotifyIcon
.
Вызов Application.Run()
.
В обработчике события Quit MenuItem
обязательно вызовите set NotifyIcon.Visible = False
, затем Application.Exit()
.
Добавьте то, что вам нужно, к ContextMenu
и обработайте правильно:)
Form1
из кода.Form1
.NotifyIcon
чтобы создать значок на панели задач (назначьте ему значок).NotifyIcon
щелчок NotifyIcon
NotifyIcon и NotifyIcon
щелчок правой и левой кнопкой мыши, устанавливая контекстное меню и показывая, для какой кнопки (правая/левая) была нажата.Application.Run()
чтобы приложение продолжало работать с Application.Exit()
для выхода. Или bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}
bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}
в bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}
bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}
. Затем установите bRunning = false;
выйти из приложения."Системный лоток" - это просто обычное приложение для форм win, разница только в том, что он создает значок в области системного лотка Windows. Чтобы создать значок sys.tray, используйте компонент NotifyIcon, вы можете найти его в панели инструментов (общие элементы управления) и изменить его свойства: значок, подсказка. Также он позволяет обрабатывать сообщения с кликом мыши и двойным щелчком.
И еще одна вещь, чтобы добиться внешнего вида и стандартного приложения. добавьте строки followinf в ваше основное шоу:
private void MainForm_Shown(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
Hide();
}
Насколько я знаю, вы должны писать приложение, используя форму, но не имеете никаких элементов управления в форме и никогда не устанавливаете ее на вид. Используйте NotifyIcon (образец MSDN которого можно найти здесь), чтобы написать ваше приложение.
Вот как я это сделал с Visual Studio 2010,.NET 4
Это очень дружественная структура для приложения Area Area Application... достаточно добавить NotificationIcon в базовую форму и сменить автоматически сгенерированный код на код ниже:
public partial class Form1 : Form
{
private bool hidden = false;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
this.ShowInTaskbar = false;
//this.WindowState = FormWindowState.Minimized;
this.Hide();
hidden = true;
}
private void notifyIcon1_Click(object sender, EventArgs e)
{
if (hidden) // this.WindowState == FormWindowState.Minimized)
{
// this.WindowState = FormWindowState.Normal;
this.Show();
hidden = false;
}
else
{
// this.WindowState = FormWindowState.Minimized;
this.Hide();
hidden = true;
}
}
}
Просто добавьте
this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;
для вашего объекта формы. В системном трее вы увидите только значок.