Как я могу сделать a.NET приложение Windows Forms, которое работает только в системном трее?
Что мне нужно сделать, чтобы сделать Windows Forms запуск приложения в системном трее?
Не приложение, которое можно свернуть в лоток, но тот, который существует только в лотке, с не более чем значок, подсказка и меню "правый клик".
10 ответов:
основной ответ на использование NotifyIcon является правильным, но, как и многие вещи .NET, есть множество тонкостей, связанных с этим право. Учебник, упомянутый Брэдом, дает хороший обзор самых основ, но не касается ни одного из них:
- правильно ли закрывает приложение из системного трея все открытые дочерние формы?
- обеспечивает ли приложение выполнение только одного экземпляра самого себя (применимо к большинству, хотя и не все, приложения для лотков)?
- как открыть дочерние окна WPF, а также дочерние окна WinForms, если это необходимо.
- как поддерживать динамические контекстные меню.
- стандартный NotifyIcon существует в пространстве WinForms; могу ли я сделать чистое решение WPF? (Да, вы можете!)
У меня только что была опубликована статья Simple-Talk.com это решает эти вопросы и более подробно, предоставляя платформу приложений лотка, которую вы можете использовать немедленно, плюс полный, реальный пример приложения, чтобы показать все на практике. Смотрите создание приложений лотка в .NET: практическое руководство, опубликовано ноябрь 2010.
статья проекта кода создание приложения Tasktray дает очень простое объяснение и пример создания приложения, которое только существует в системном трее.
в принципе изменить
Application.Run(new Form1());в строкеProgram.csчтобы вместо этого запустить класс, который наследует отApplicationContext, и пусть конструктор для этого класса инициализирует aNotifyIconstatic 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();щелкните правой кнопкой мыши, чтобы получить контекстное меню обрабатывается автоматически, но если вы хотите сделать некоторые действия на левой кнопкой мыши вам нужно будет добавить Щелкните обработчик:
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; } }
Я написал приложение traybar с .NET 1.1, и мне не нужна форма.
Прежде всего, установите объект запуска проекта как SubMain, определенный в модуле.
Затем создайте программно компоненты:NotifyIconиContextMenu.
Обязательно включитеMenuItem"выйти" или аналогичный.
СвяжитеContextMenuдоNotifyIcon.
ВызватьApplication.Run().
В обработчике событий для QuitMenuItemобязательно позвоните setNotifyIcon.Visible = False, потомApplication.Exit(). Добавьте то, что вы нужно, чтобыContextMenuи правильно обработать :)
- создайте новое приложение Windows с помощью мастера.
- удалить
Form1из кода.- удалить код в программу.cs запускает
Form1.- использовать
NotifyIconкласс для создания значка в системном трее (присвоить ему значок).- добавить contextmenu к нему.
- или реагировать
NotifyIcon' s mouseclick и differenciate между правой и левой кнопкой мыши, установив свой contextmenu и показывая его, для которого когда-либо кнопка (вправо/влево) был нажат.Application.Run(), чтобы сохранить приложение работает сApplication.Exit()бросить. Илиwhile(bRunning){Application.DoEvents;Thread.Sleep(10);}. Затем установитеbRunning = falseдля выхода из приложения.
приложение "системный трей" - это просто обычное приложение win forms, разница только в том, что оно создает значок в области системного трея windows. Для того, чтобы создать sys.значок в трее используйте компонент NotifyIcon, вы можете найти его в Toolbox(общие элементы управления) и изменить его свойства: значок, подсказка. Также он позволяет обрабатывать сообщения щелчка мыши и двойного щелчка.
и еще одна вещь, для того, чтобы достичь внешний вид и чувствует себя или стандартный лоток приложение. добавьте следующие строки в основную форму показать событие:
private void MainForm_Shown(object sender, EventArgs e) { WindowState = FormWindowState.Minimized; Hide(); }
насколько мне известно, вы должны по-прежнему писать приложение с помощью формы, но не имеют никаких элементов управления на форме и никогда не установить его видимым. Используйте NotifyIcon (образец MSDN которого можно найти здесь) написать заявление.
вот как я это сделал с Visual Studio 2010, .NET 4
- создание приложений на основе форм Windows, установить сделать один экземпляр приложения в свойства
- добавить ContextMenuStrip
- добавьте некоторые записи в полосу контекстного меню, дважды щелкните по ним, чтобы получить обработчики, например, "выход" (двойной щелчок) -> обработчик -> me.Закрыть()
- добавьте NotifyIcon, в конструктор set contextMenuStrip к тому, который вы только что создали, выберите значок (вы можете найти его в папке VisualStudio в разделе 'common7...')
- задать свойства формы в конструкторе: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar:false, непрозрачность:0%, WindowState: Minimized
- Добавить Меня.Visible=false в конце Form1_Load, это скроет значок, когда используя Ctrl + Tab
- запуск и настройка по мере необходимости.
это очень удобный фреймворк для применения области уведомлений... достаточно добавить 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;к объекту формы. Вы увидите только значок в трее.
Comments