zminimalizuj aplikację do zasobnika systemowego


114

Mam aplikację Windows Forms obsługiwaną przez C # i Visual Studio 2010.

Jak zminimalizować aplikację do paska zadań (nie paska zadań), a następnie przywrócić ją po dwukrotnym kliknięciu w zasobniku systemowym? dowolny pomysł? także, jak mogę utworzyć menu w ikonie w zasobniku systemowym, a kiedy klikam je prawym przyciskiem myszy, pokazuje menu takie jak Zaloguj, Rozłącz, Połącz, coś w tym rodzaju. Czy są też jakieś metody pokazania jak balon wyskakujący z zasobnika systemowego?

PS: Dodałem już notifyIcon, ale nie wiem, jak go używać.


Tutaj możesz pobrać świetny przykładowy kod simple-talk.com/dotnet/.net-framework/…
Deweloper

Będziesz chciał wejść do Designer.cs formularza i "zarejestrować" program obsługi zdarzeń, albo żaden z nich nie zadziała (nie mogłem tego rozgryźć). Możesz to zrobić, dodając coś takiego: this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Brad

Odpowiedzi:


149

Obsługuj zdarzenie Resize formularza. W tej procedurze obsługi przesłaniasz podstawową funkcjonalność zdarzenia Resize, aby zminimalizować formularz do zasobnika systemowego, a nie do paska zadań. Można to zrobić, wykonując następujące czynności w programie obsługi zdarzeń Resize formularza: Sprawdź, czy właściwość WindowState formularza jest ustawiona na FormWindowState.Minimized. Jeśli tak, ukryj formularz, włącz obiekt NotifyIcon i pokaż wskazówkę w dymku, która zawiera niektóre informacje. Gdy WindowState stanie się FormWindowState.Normal, wyłącz obiekt NotifyIcon, ustawiając jego właściwość Visible na false. Teraz chcesz, aby okno pojawiło się ponownie po dwukrotnym kliknięciu obiektu NotifyIcon na pasku zadań. W tym celu obsłuż zdarzenie MouseDoubleClick NotifyIcon. Tutaj możesz pokazać formularz za pomocą metody Show ().

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

5
można zmienić właściwość Form.FormBorderStyle msdn.microsoft.com/en-us/library/…
CD ..

tnx! zadziałało .. także jakiś pomysł na wyłączenie tych przycisków minimalizacji, zamykania i maksymalizacji w prawym górnym rogu? tnx
WantIt


tnx to też zadziałało! również, kiedy dwukrotnie kliknę ikonę w zasobniku systemowym, okno nie znajduje się na wierzchu z innymi aplikacjami, muszę się postarać, klikając okno na pasku zadań, aby się pojawiło. Jak sobie z tym poradzimy?
tnx


69

Okazało się, że to pozwala osiągnąć całe rozwiązanie. Powyższa odpowiedź nie powoduje usunięcia okna z paska zadań.

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

Dobrze jest również ustawić następujące właściwości kontrolki ikony powiadamiania za pomocą projektanta formularzy.

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

7
Brakuje ci this.Show();wcześniejthis.WindowState = FormWindowState.Normal;
developerwjk

1
Literówka w „użytkownik nic nie robi”. ;)
Andrew,

1
@developerwjk, nie brakuje, ponieważ nie dzwoni Hide(). Ale problem z tym podejściem polega na tym, że okno nadal pojawia się po naciśnięciu Alt-Tab. Wolę dzwonić Hide()i dzięki temu nie musisz ShowInTaskbarw ogóle korzystać z nieruchomości.
Andrew,

@Andrew Mam problemy podczas używania Show()i Hide(); po ukryciu, pokazaniu, a następnie ukryciu, nie pokaże się ponownie.
newbieguy

@newbieguy, myślę, że musisz utworzyć nowe pytanie, ponieważ Twój problem nie nadaje się do komentowania odpowiedzi. Będziesz musiał podać więcej informacji, jako kod, którego używasz. Możesz dołączyć link do odpowiedzi, której próbowałeś użyć.
Andrew,

17

Poszedłbym z

private void Form1_Resize(object sender, EventArgs e)
{
     if (FormWindowState.Minimized == this.WindowState)
     {
          notifyIcon1.Visible = true;
          notifyIcon1.ShowBalloonTip(500);
          this.Hide();    
     }
     else if (FormWindowState.Normal == this.WindowState)
     {
          notifyIcon1.Visible = false;
     }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}

17

nie zapomnij dodać pliku ikony do swojego notifyIcon, bo nie pojawi się on w zasobniku.


najbardziej potrzebna część tematu. Czy możesz dodać trochę więcej informacji, jak zmusić go do używania domyślnej ikony?
T.Todua

12

Spróbuj tego

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

1
Jeśli po prostu ukryjesz się przed paskiem zadań zamiast dzwonić this.Hide(), okno nadal pojawia się podczas wykonywania Alt-Tab.
Andrew,

3

Jest to metoda, której używam w moich aplikacjach, jest dość prosta i nie wymaga wyjaśnień, ale z przyjemnością podam więcej szczegółów w odpowiedzi na Twoje komentarze.

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }

2
To i inne rozwiązania mają jeden problem: jeśli formularz jest ukryty pod innymi oknami, użytkownik najprawdopodobniej nie chce go minimalizować po kliknięciu ikony. Zamiast tego powinien być skoncentrowany. Zobacz moje pytanie tutaj: stackoverflow.com/questions/36797442/ ...
maf-soft

1

Klikając na obraz w zasobniku systemowym, możesz sprawdzić, czy ramka jest widoczna, a następnie musisz ustawić Visible = true lub false


1

... a dla menu powiadomień po kliknięciu prawym przyciskiem myszy dodaj menu kontekstowe do formularza, edytuj je i ustaw zdarzenia kliknięcia myszą dla każdego elementu menu kontekstowego, klikając je dwukrotnie, a następnie dołącz je do powiadomieniaicon1, wybierając właściwość ContextMenuStrip we właściwości notifyicon.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.