2008-11-12 12 views
16

Połączyłem się z często łączoną końcówką, aby zmniejszyć liczbę aplikacji do paska systemowego: http://www.developer.com/net/csharp/article.php/3336751 Teraz działa, ale nadal występuje problem: moja aplikacja jest wyświetlana po uruchomieniu; Chcę, aby uruchomił się bezpośrednio w zasobniku systemowym. Próbowałem zminimalizować i ukryć to w zdarzeniu Load, ale nie robi nic.Po uruchomieniu programu w zasobniku systemowym

Edycja: Mogę, jak sugerowałby to plakat, zmodyfikować właściwości skrótu, ale wolę użyć kodu: Nie mam pełnej kontroli nad każdym komputerem, na którym jest zainstalowane oprogramowanie.

Nie chcę go całkowicie usunąć z dowolnego miejsca z wyjątkiem zasobnika systemowego, po prostu chcę, aby zacząć zminimalizować.

Wszelkie pomysły?

Dzięki

Odpowiedz

25

W swoim głównym programie prawdopodobnie masz linię formularz:

Application.Run(new Form1()); 

Wymusi to wyświetlenie formularza. Trzeba będzie tworzyć formę, ale nie przekazać go do Application.Run:

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

Należy pamiętać, że program będzie teraz nie zakończyć aż zadzwonisz Application.ExitThread(). Najlepiej zrobić to z programu obsługi zdarzenia FormClosed.

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

Jeśli używasz NotifyIcon, spróbuj zmienić ShowInTaskbar false.

Aby usunąć go z ekranu Alt + Tab, spróbuj zmienić styl obramowania okna; Wierzę, że niektóre z narzędziowni oknie style nie pojawiają ...

coś takiego:

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

Jeśli nadal pojawia się w Alt + Tab, można zmieniać style okna poprzez p/wywołać (a hackier bit):

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

to jak to zrobić

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

Ponieważ ten został oznaczony VB.NET, oto co zrobiłem w aplikacji usługi Windows i Controller Właśnie skończyłem, dodać moduł kodu do projektu instalacji do NotifyIcon a to wiąże się menu kontekstowe w Sub Main(), a następnie ustaw obiekt startowy aplikacji na Sub Main() zamiast formularza.

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 

W Config() tworzę instancję mojego formularza i wyświetlam go.

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

End Sub 
0

Proszę bardzo:

Tworzenie klas 2, 1, która dziedziczy z ApplicationContext. Drugi zawiera tylko główną procedurę. Zrobiłem przykład, który ma formularz i powiadomienie, które po dwukrotnym kliknięciu wyświetla formularz iz powrotem.

Pamiętaj, aby ustawić „Sub Main” jako obiekt startowego Moje ustawienia projektu i punkt do rzeczywistego pliku * .ico zamiast f: \ TP.ico .. :)

Kodeks powinien oczywiście być nadziewane z prawidłowym kodem obsługi błędów.

Klasa1:

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 
Powiązane problemy