Что мне нужно сделать, чтобы приложение 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;
для вашего объекта формы. В системном трее вы увидите только значок.