2008-11-12 9 views
16

J'ai suivi le conseil commun pour réduire une application à la barre d'état système: http://www.developer.com/net/csharp/article.php/3336751 Maintenant, cela fonctionne, mais il y a toujours un problème: mon application est affichée quand elle démarre; Je veux que ça commence directement dans le systray. J'ai essayé de le minimiser et de le cacher dans l'événement Load, mais cela ne fait rien. Editer: Je pourrais, comme le suggère une affiche, modifier les propriétés du raccourci, mais je préfèrerais utiliser le code: je n'ai pas un contrôle complet sur tous les ordinateurs sur lesquels le logiciel est installé.Mettre un programme dans la barre d'état système au démarrage

Je ne veux pas l'enlever complètement de tout sauf le systray, je veux juste qu'il commence à minimiser.

Des idées?

Merci

Répondre

25

Dans votre programme principal, vous avez probablement une ligne de la forme:

Application.Run(new Form1()); 

Ceci forcera la forme à être montrée. Vous devrez créer la forme, mais pas passe à Application.Run:

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

Notez que le programme va maintenant pas fin jusqu'à ce que vous appelez Application.ExitThread(). Il est préférable de le faire à partir d'un gestionnaire pour l'événement FormClosed.

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

Si vous utilisez un NotifyIcon, essayez de changer ShowInTaskbar false.

Pour le supprimer de l'écran Alt + Tab, essayez de changer le style de bordure de votre fenêtre; Je crois que certains des styles outil fenêtre ne semblent pas ...

quelque chose comme:

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()); 
    } 
} 

Si elle apparaît toujours dans l'Alt + Tab, vous pouvez modifier les styles de fenêtre à travers p/Invoke (un peu hackier):

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); 
13

Voici comment faire

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

Depuis cela a été taggés avec vb.net, voici ce que je l'ai fait dans une application Windows Service et contrôleur Je viens de terminer, Ajouter un module de code au projet, le programme d'installation du NotifyIcon et il est associé menu contextuel dans Sub Main(), puis définissez l'objet de démarrage de l'application sur Sub Main() au lieu du formulaire.

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 

Dans Config(), je crée une instance de mon formulaire et l'affiche.

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

End Sub 
0

Ici, vous allez:

Créer 2 classes, 1 qui hérite de ApplicationContext. L'autre contient seulement une routine principale. J'ai fait un exemple qui a un formulaire et un notifyicon qui lorsque double-clique fait apparaître le formulaire et revenir.

Souvenez-vous de régler « Sub Main » comme objet de démarrage dans Mes paramètres du projet et le point à un vrai fichier * .ico au lieu de f: \ TP.ico .. :)

code devrait bien sûr être farcie avec un code de gestion des erreurs approprié.

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 

Classe2:

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 
Questions connexes