2008-11-12 2 views
16

Я следил за общими советами для уменьшения приложения в системном лотке: http://www.developer.com/net/csharp/article.php/3336751 Теперь он работает, но все еще есть проблема: мое приложение отображается при его запуске; Я хочу, чтобы он начинался прямо в systray. Я попытался минимизировать и скрыть его в событии Load, но он ничего не делает.Положите программу в системный лоток при запуске

Редактировать: я мог бы, как предлагалось, изменить свойства ярлыка, но я бы предпочел использовать код: у меня нет полного контроля над каждым компьютером, на котором установлена ​​программа.

Я не хочу полностью удалять его извне, кроме системного, я просто хочу, чтобы он был сведен к минимуму.

Любые идеи?

Благодаря

ответ

25

В главной программе вы, вероятно, есть линия форма:

Application.Run(new Form1()); 

Это заставит форму отображать. Вам нужно будет создать форму, но не передать его Application.Run:

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

Обратите внимание, что программа теперь не прекращается, пока вы не вызовете Application.ExitThread(). Лучше всего это сделать из обработчика для события FormClosed.

private void Form1_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    Application.ExitThread(); 
} 
3

Если вы используете NotifyIcon, попробуйте изменить ShowInTaskbar ложь.

Чтобы удалить его с экрана Alt + Tab, попробуйте изменить стиль рамки окна; Я считаю, что некоторые из инструментального окна стилей не появляются ...

что-то вроде:

using System; 
using System.Windows.Forms; 
class MyForm : Form 
{ 
    NotifyIcon sysTray; 

    MyForm() 
    { 
     sysTray = new NotifyIcon(); 
     sysTray.Icon = System.Drawing.SystemIcons.Asterisk; 
     sysTray.Visible = true; 
     sysTray.Text = "Hi there"; 
     sysTray.MouseClick += delegate { MessageBox.Show("Boo!"); }; 

     ShowInTaskbar = false; 
     FormBorderStyle = FormBorderStyle.SizableToolWindow; 
     Opacity = 0; 
     WindowState = FormWindowState.Minimized; 
    } 

    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.Run(new MyForm()); 
    } 
} 

Если он по-прежнему появляется в Alt + Tab, вы можете изменить стили окна с помощью P/Invoke (немного дилетантский):

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    IntPtr handle = this.Handle; 
    int currentStyle = GetWindowLong(handle, GWL_EXSTYLE); 
    SetWindowLong(handle, GWL_EXSTYLE, currentStyle | WS_EX_TOOLWINDOW); 
} 
private const int GWL_EXSTYLE = -20, WS_EX_TOOLWINDOW = 0x00000080; 
[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern int SetWindowLong(IntPtr window, int index, int value); 
[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern int GetWindowLong(IntPtr window, int index); 
2

Как немного в cludge, вы можете настроить ярлык, который запускает приложение, чтобы «запустить минимизированы»? Это может дать вам то, что вам нужно!

Как так: (изображение только пример с Google) ...

Run Minimized http://www.unixwiz.net/images/ygpm-shortcut-4.gif

13

это, как вы это делаете

static class Program 
{ 
    [STAThread] 
    static void Main() 
    { 
     NotifyIcon icon = new NotifyIcon(); 
     icon.Icon = System.Drawing.SystemIcons.Application; 
     icon.Click += delegate { MessageBox.Show("Bye!"); icon.Visible = false; Application.Exit(); }; 
     icon.Visible = true; 
     Application.Run(); 
    } 
} 
1

Поскольку это был помечен vb.net, вот что я сделал в приложении службы Windows, и контроллер я только что закончил, добавить модуль кода в проект, настройки в NotifyIcon и это связано Контекстное меню в Sub Main(), а затем установите Объект запуска приложения в Sub Main() вместо формы.

Public mobNotifyIcon As NotifyIcon 
Public WithEvents mobContextMenu As ContextMenu 

Public Sub Main() 

    mobContextMenu = New ContextMenu 
    SetupMenu() 
    mobNotifyIcon = New NotifyIcon() 
    With mobNotifyIcon 
     .Icon = My.Resources.NotifyIcon 
     .ContextMenu = mobContextMenu 
     .BalloonTipText = String.Concat("Monitor the EDS Transfer Service", vbCrLf, "Right click icon for menu") 
     .BalloonTipIcon = ToolTipIcon.Info 
     .BalloonTipTitle = "EDS Transfer Monitor" 
     .Text = "EDS Transfer Service Monitor" 
     AddHandler .MouseClick, AddressOf showBalloon 
     .Visible = True 
    End With 
    Application.Run() 
End Sub 

Private Sub SetupMenu() 
    With mobContextMenu 

     .MenuItems.Add(New MenuItem("Configure", New EventHandler(AddressOf Config))) 
     .MenuItems.Add("-") 
     .MenuItems.Add(New MenuItem("Start", New EventHandler(AddressOf StartService))) 
     .MenuItems.Add(New MenuItem("Stop", New EventHandler(AddressOf StopService))) 
     .MenuItems.Add("-") 
     .MenuItems.Add(New MenuItem("Exit", New EventHandler(AddressOf ExitController))) 
    End With 
    GetServiceStatus() 
End Sub 

В Config() я создаю экземпляр своей формы и отображаю его.

Private Sub Config(ByVal sender As Object, ByVal e As EventArgs) 
    Using cs As New ConfigureService 
     cs.Show() 
    End Using 

End Sub 
0

Здесь вы идете:

Создание 2 классов 1, которые наследуются от ApplicationContext. Другая содержит только основную процедуру. Я привел пример с формой и уведомлением, который при двойном щелчке поднимает форму и обратно.

Не забудьте установить «Sub Main» в качестве объекта запуска в настройках моего проекта, и указывают на реальный * .ico файл вместо F: \ TP.ico .. :)

Кодекс должен быть, конечно, фаршированная с правильным кодом обработки ошибок.

Class1:

Imports System.threading 
Imports System.Runtime.InteropServices 
Imports System.Windows.Forms 


Public Class Class1 

    <System.STAThread()> _ 
     Public Shared Sub Main() 

     Try 
      System.Windows.Forms.Application.EnableVisualStyles() 
      System.Windows.Forms.Application.DoEvents() 
      System.Windows.Forms.Application.Run(New Class2) 
     Catch invEx As Exception 

      Application.Exit() 

     End Try 


    End Sub 'Main End Class 

Class2:

Imports System.Windows.Forms 
Imports System.drawing 

Public Class Class2 
    Inherits System.Windows.Forms.ApplicationContext 

    Private WithEvents f As New System.Windows.Forms.Form 
    Private WithEvents nf As New System.Windows.Forms.NotifyIcon 

    Public Sub New() 

     f.Size = New Drawing.Size(50, 50) 
     f.StartPosition = FormStartPosition.CenterScreen 
     f.WindowState = Windows.Forms.FormWindowState.Minimized 
     f.ShowInTaskbar = False 
     nf.Visible = True 
     nf.Icon = New Icon("f:\TP.ico") 
    End Sub 


    Private Sub nf_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Handles nf.DoubleClick 
     If f.WindowState <> Windows.Forms.FormWindowState.Minimized Then 
      f.WindowState = Windows.Forms.FormWindowState.Minimized 
      f.Hide() 
     Else 
      f.WindowState = Windows.Forms.FormWindowState.Normal 
      f.Show() 
     End If 
    End Sub 

    Private Sub f_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles f.FormClosed 
     Application.Exit() 
    End Sub End Class 
Смежные вопросы