Jak mogę utworzyć aplikację .NET Windows Forms, która działa tylko w zasobniku systemowym?

216

Co muszę zrobić, aby aplikacja Windows Forms działała w zasobniku systemowym?

Nie jest to aplikacja, która może zminimalizować do zasobnika, ale taka, która istnieje tylko w zasobniku, z ikoną, podpowiedzią i menu „prawym przyciskiem myszy”.

xyz
źródło
9
W większości odpowiedzi brakuje czegoś - nie zapomnij ustawić icon.Visible = false, a następnie Dispose()ikonę przy zamykaniu aplikacji. W przeciwnym razie po wyjściu z programu nadal będzie widoczna ikona. Po kilkukrotnym przetestowaniu nie będziesz już wiedział, która ikona jest prawdziwa.
Tomasz Gandor
Jeśli szukasz bardziej nowoczesnego podejścia WPF - możesz spróbować: codeproject.com/Articles/36788/…
Murray Foxcroft

Odpowiedzi:

86

Artykuł dotyczący projektu kodu Tworzenie aplikacji Tasktray zawiera bardzo proste wyjaśnienie i przykład tworzenia aplikacji, która istnieje tylko w zasobniku systemowym.

Zasadniczo zmień Application.Run(new Form1());wiersz, Program.csaby zamiast tego uruchomić klasę, która dziedziczy ApplicationContext, i niech konstruktor tej klasy zainicjujeNotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}
Fawzan Izy
źródło
13
To świetny punkt wyjścia. Pamiętaj, że „AppIcon” musi być nazwą zasobu, który dodajesz za pomocą „Projekt -> Właściwości -> Zasoby -> Dodaj zasób”, a następnie ponownie skompiluj projekt.
Lavamantis,
1
Zrobiłem właściwości .. zasoby .. dodaj zasoby..icon .. ponownie skompilowałem, nadal otrzymuję „Błąd CS0103 Nazwa„ Zasoby ”nie istnieje w bieżącym kontekście”
barlop
@barlop Musiałem napisać tak: Properites.Resources.AppIcon
Simon Perepelitsa
@ SimonPerepelitsa dzięki, nie jestem pewien, co zrobiłem w swoich eksperymentach, chciałem skomentować, co zadziałało, ale musiałem zapomnieć o niektórych rzeczach, które zrobiłem, które zadziałały. Ale ostatecznie metodą, którą zastosowałem, było przeciągnięcie ikony powiadomienia z palety rzeczy, które możesz przeciągnąć. Następnie kliknij go w formularzu, kliknij małą strzałkę, która wywołuje menu, aby wybrać dla niego ikonę!
barlop
17

Jak mówi mat1t - musisz dodać NotifyIcon do swojej aplikacji, a następnie użyć czegoś takiego jak poniższy kod, aby ustawić podpowiedź i menu kontekstowe:

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

Ten kod pokazuje ikonę tylko w zasobniku systemowym:

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

Jeśli masz formularz (z dowolnego powodu), potrzebne będą:

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

Kliknięcie prawym przyciskiem myszy, aby wyświetlić menu kontekstowe, jest obsługiwane automatycznie, ale jeśli chcesz wykonać pewne czynności przy kliknięciu lewym przyciskiem, musisz dodać moduł obsługi kliknięć:

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }
ChrisF
źródło
15

Napisałem aplikację paska zadań z .NET 1.1 i nie potrzebowałem formularza.
Przede wszystkim ustaw obiekt startowy projektu jako Sub Main, zdefiniowany w module.
Następnie utwórz programowo komponenty: NotifyIconi ContextMenu.
Pamiętaj o dołączeniu MenuItem„Quit” lub podobnego.
Powiązać ContextMenuz NotifyIcon.
Invoke Application.Run().
W obsługi zdarzeń dla Quit MenuItemnależy zadzwonić zestawu NotifyIcon.Visible = False, a następnie Application.Exit(). Dodaj to, czego potrzebujesz, ContextMenui odpowiednio postępuj :)

M.Turrini
źródło
11
  1. Utwórz nową aplikację Windows za pomocą kreatora.
  2. Usunąć Form1 z kodu.
  3. Usuń kod z Program.cs podczas uruchamiania Form1 .
  4. Użyj NotifyIcon klasy, aby utworzyć ikonę zasobnika systemowego (przypisz do niej ikonę).
  5. Dodaj do niego menu kontekstowe.
  6. Lub zareagować NotifyIcon kliknięcie myszą i rozróżnij kliknięcie prawym i lewym przyciskiem myszy, ustawiając menu kontekstowe i pokazując, dla którego dowolnego przycisku (prawy / lewy) został naciśnięty.
  7. Application.Run()aby aplikacja działała, Application.Exit()by wyjść. Lub a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Następnie ustaw, bRunning = false;aby zamknąć aplikację.
Wolf5
źródło
Program przestaje działać po osiągnięciu końca Main i nie ma wątku interfejsu użytkownika. Jak się tym zajmujesz, to twoje rozwiązanie? Jeśli rozwiązałeś te problemy, dostajesz mój głos :)
Matthew Steeples
Dostajesz mój głos. Może po prostu wspomnij, że nadal musisz zadzwonić do Application.Run bez żadnych parametrów?
Zaktualizowany o alternatywę dla App.Run.
Wolf5
Wątek. Sen jest przesadzony Wiem, ale jeśli masz lepszą pętlę „uśpienia” alternatywną dla Application.Run zrób to :)
Wolf5
Thread.Sleep to zły pomysł: skończysz zużywając więcej procesora i baterii niż gdybyś właśnie zrobił Application.Run jak chcesz.
Sneftel
8

Aplikacja „System tray” jest zwykłą aplikacją do wygrywania formularzy, jedyną różnicą jest to, że tworzy ikonę w obszarze Windows system tray. Aby utworzyć ikonę sys.tray, użyj składnika NotifyIcon, możesz go znaleźć w Przyborniku (Wspólne elementy sterujące) i zmodyfikować jego właściwości: Ikona, podpowiedź. Umożliwia także obsługę wiadomości z kliknięciami myszy i podwójnym kliknięciem.

I jeszcze jedno, aby uzyskać wygląd i standardową aplikację zasobnika. dodaj linie followinf w głównym wydarzeniu pokazowym:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 
Gordon Freeman
źródło
6

O ile mi wiadomo, nadal musisz pisać aplikację za pomocą formularza, ale nie masz żadnych kontrolek w formularzu i nigdy nie ustawiam go jako widocznego. Użyj NotifyIcon (próbkę MSDN można znaleźć tutaj ), aby napisać aplikację.

Matthew Steeples
źródło
1
Nie do końca. Twoje formularze mogą zawierać formanty, ale powinny być domyślnie ukryte.
Rune Grimstad,
5
Nie potrzebujesz żadnej formy. Po nowym kreatorze tworzenia aplikacji Windows po prostu usuń formularz Form1 i usuń kod otwierający go. Możesz to wszystko napisać z Program.cs z NotifyIcon i ContextMenu. Nic więcej nie jest wymagane.
Wolf5
1
Wiem, że może zawierać elementy sterujące, ale OP nie chce tego
Matthew Steeples
2

Oto jak to zrobiłem z Visual Studio 2010 , .NET 4

  1. Utwórz aplikację Windows Forms, ustaw „Utwórz aplikację pojedynczej instancji” we właściwościach
  2. Dodaj ContextMenuStrip
  3. Dodaj niektóre wpisy do paska menu kontekstowego, kliknij je dwukrotnie, aby uzyskać programy obsługi, na przykład „exit” (podwójne kliknięcie) -> moduł obsługi -> me.Close ()
  4. Dodaj NotifyIcon, w ustawionym przez projektanta kontekścieMenuStrip do właśnie utworzonego, wybierz ikonę (możesz go znaleźć w folderze VisualStudio pod „common7 ...”)
  5. Ustaw właściwości formularza w projektancie: FormBorderStyle: brak, ShowIcon: false, ShowInTaskbar: false, Krycie: 0%, WindowState: Zminimalizowane
  6. Dodaj Me.Visible = false na końcu Form1_Load, ukryje to ikonę podczas używania Ctrl +Tab
  7. Uruchom i dostosuj w razie potrzeby.
Ewoluował
źródło
2

Jest to bardzo przyjazny framework dla aplikacji Notification Area Application ... wystarczy dodać NotificationIcon do podstawowego formularza i zmienić automatycznie wygenerowany kod na kod poniżej:

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}
Sebastian Xawery Wiśniowiecki
źródło
-2

Po prostu dodaj

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

do obiektu formularza. Zobaczysz tylko ikonę na pasku zadań.

YTerle
źródło
To umieszcza formularz nad paskiem zadań. Nie to samo. Czy próbujesz odpowiedzieć na inny post?
LarsTech,
1
Na pasku zadań nie ma ikony, nie widzimy formy. Program wizualnie istnieje tylko w zasobniku systemowym. Co oznacza powyższe ?
YTerle
Twoja odpowiedź nie zawiera żadnego kontekstu. Czy używasz klasy NotifyIcon? Jeśli nie, formularz minimalizuje się do lewego dolnego rogu nad paskiem zadań.
LarsTech,
1
Jeśli nie jesteś zajęty, spróbuj napisać i uruchomić go.
YTerle