2008-11-12 15 views
16

Seguí la sugerencia comúnmente vinculada para reducir una aplicación a la bandeja del sistema: http://www.developer.com/net/csharp/article.php/3336751 Ahora funciona, pero todavía hay un problema: mi aplicación se muestra cuando se inicia; Quiero que comience directamente en la bandeja del sistema. Traté de minimizar y ocultarlo en el evento Load, pero no hace nada.Poner un programa en la bandeja del sistema al inicio

Editar: Podría, como sugirió un afiche, modificar las propiedades del acceso directo, pero prefiero usar el código: no tengo control completo sobre cada computadora en la que está instalado el software.

No quiero eliminarlo completamente de todas partes excepto de la bandeja del sistema, solo quiero que comience a minimizarse.

¿Alguna idea?

Gracias

Respuesta

25

En el programa principal es probable que tenga una línea de el formulario:

Application.Run(new Form1()); 

Esto forzará que se muestre el formulario. Usted tendrá que crear la forma, pero no pase a Application.Run:

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

Tenga en cuenta que el programa ya no va a terminar hasta que llame Application.ExitThread(). Lo mejor es hacer esto desde un controlador para el evento FormClosed.

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

Si está utilizando un NotifyIcon, trate de cambiar a ShowInTaskbar falsa.

Para eliminarlo de la pantalla Alt + Tab, intente cambiar el estilo del borde de la ventana; Creo que algunos de la herramienta de ventana no aparecen estilos ...

algo como:

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 sigue apareciendo en el Alt + Tab, puede cambiar los estilos de ventana a través de P/Invoke (hackier un poco):

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

esta es la forma de hacerlo

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

Dado que este fue etiquetado con vb.net, esto es lo que hice en una aplicación de servicio de Windows y el controlador acabo de terminar, añadir un módulo de código al proyecto, el programa de instalación del NotifyIcon y su menú de contexto asociado en Sub Main(), y luego configure el objeto de inicio de la aplicación en el Sub Main() en lugar del Formulario.

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 

En la configuración(), creo una instancia de mi formulario y lo visualizo.

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

End Sub 
0

Aquí van:

crear 2 clases, que hereda de 1 Application Context. El otro solo contiene una rutina principal. He hecho un ejemplo que tiene un formulario y un icono de notificación que cuando se hace doble clic, aparece el formulario y viceversa.

Recuerde que debe establecer "Sub Main" como objeto de inicio en Mi configuración del proyecto y apuntan a un verdadero archivo .ico * en lugar de f: \ TP.ico .. :)

Código debe por supuesto ser rellenado con el código de manejo de errores adecuado.

Clase 1:

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 

Clase 2:

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 
Cuestiones relacionadas