2009-10-24 4 views
9

Я имею в виду, когда пользователь запускает мое приложение (exe). Я хочу, чтобы он начинался прямо в системном трее, не показывая окно. Как и антивирусные программы & менеджеров загрузки, которые запускаются и запускаются в системном лотке молча.Как запустить приложение непосредственно в системном трее? (.NET C#)

Мне нужен тот же эффект, и когда пользователь нажимает кнопку «show» контекстного контекста notifyIcon, тогда только приложение должно отображать GUI.

Я использую это, но он не работает

private void Form_Load(object sender, EventArgs e) 
    { 
     this.Hide(); 
    } 

Может быть мне нужно иметь функцию Main() в какой-либо другой класс, который не имеет графического интерфейса, но имеет NotifyIcon & ContextMenuStrip, чей вариант будет экземпляр GUI класс окна. Правильно?

+0

См. Также этот вопрос - http://stackoverflow.com/questions/807005/c-net-winforms-instantiate-a-form-without-showing-it – ChrisF

+0

Извините, что вытащил старую тему. У меня есть все, кроме одной важной вещи. Я понимаю, что 'Application.Run()' существенно освобождает управление (?). Я хочу сделать код, который делает что-то без взаимодействия с пользователем (скажем, он обрабатывает данные и записывает их в файл). Где бы я поместил этот код так, чтобы он выполнялся, пока программа сидит в системном трее? –

+0

@BarryDysert: 'Приложение.Run() 'запускает насос сообщений Windows. Если у вас нет этого вызова где-нибудь, ваш значок в трее не будет работать вообще. Не зная ничего о том, чего вы на самом деле пытаетесь достичь, я бы сказал, чтобы посмотреть на потоки, просто знайте о проблемах, изменяющих материал пользовательского интерфейса в потоках, отличных от тех, из которых вызывается 'Application.Run()'. –

ответ

27

Как я обычно настроить что-то вроде этого, чтобы изменить Program.cs выглядеть примерно следующим :

[STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     using (NotifyIcon icon = new NotifyIcon()) 
     { 
      icon.Icon = System.Drawing.Icon.ExtractAssociatedIcon(Application.ExecutablePath); 
      icon.ContextMenu = new ContextMenu(new MenuItem[] { 
       new MenuItem("Show form", (s, e) => {new Form1().Show();}), 
       new MenuItem("Exit", (s, e) => { Application.Exit(); }), 
      }); 
      icon.Visible = true; 

      Application.Run(); 
      icon.Visible = false; 
     } 
    } 

Используя это, вам не нужно беспокоиться о скрытии вместо закрытия форм и все остальные писаки, которые могут привести к ... вы можете сделать форму одиночки тоже вместо инстанцирования нового Form каждый т Нажмите кнопку «Показать форму». Это что-то, что нужно сделать, а не конечное решение.

+1

В качестве дополнительного примечания вам нужно использовать проект GUI, несмотря на то, что этот код появляется до появления какого-либо графического интерфейса, иначе вы получите окно консоли, что даже хуже, чем исходная проблема! –

+0

Удивительный !! Это именно то, что я ищу. Но как изменить значок. Икон? Я хочу поставить здесь свой * .ico. вместо извлеченного. – claws

+1

'new System.Drawing.Icon (« C: \ Path \ To \ Icon.ico »)' из памяти или использовать ресурс (рекомендуется). Дополнительную информацию о том, как создавать/использовать ресурсы, см. В этом другом вопросе: http://stackoverflow.com/questions/90697/how-to-create-and-use-resources-in-c-net-vs-2008 –

3

Вам также нужно установить значок уведомления.

либо вручную, либо с помощью панели инструментов (перетащить NotifyIcon на форму) создать NotifyIcon:

this.notifyIcon = new System.Windows.Forms.NotifyIcon(components); 

Затем добавьте этот код в Form_Load():

// Notify icon set up 
notifyIcon.Visible = true; 
notifyIcon.Text = "Tooltip message here"; 
this.ShowInTaskbar = false; 
this.Hide(); 

Хотя это будет, как было указал, кратко покажите форму, прежде чем спрятать ее.

Из принятого ответа this question, решение, как представляется, изменить:

Application.Run(new Form1()); 

к:

Form1 f = new Form1(); 
Application.Run();   

в Main().

+0

На самом деле у меня есть настройка notifyIcon. Итак, я просто добавил this.ShowInTaskbar = false; , но проблема в том, что окно отображается на мгновение, а затем скрывается. Я не хочу этого. – claws

+0

Проверьте мое решение, затем когти. Это устранит эту проблему. –

+0

Вы пытались настроить 'WindowState' на' Minimized'? – ChrisF

0

Вы создали приложение Windows на C#? Вам нужно перетащить элемент управления NotifyIcon в форму, элемент управления будет помещен ниже формы, поскольку он не имеет визуального представления на самой форме.

Затем вы устанавливаете свои свойства, такие как Icon ...

Попробуйте это первый ...

Смежные вопросы