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

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

Nie aplikacja, która może zminimalizować do zasobnika, ale taka, która istnieje tylko w zasobniku, z niczym więcej niż ikoną, podpowiedzią i menu "prawym przyciskiem myszy".

Author: Peter Mortensen, 2009-06-15

10 answers

Podstawowa odpowiedź korzystania z NotifyIcon jest poprawna, ale, jak wiele rzeczy. NET, jest wiele subtelności zaangażowanych w to right. W samouczku wspomnianym przez Brada można zapoznać się z podstawami, ale nie odnosi się do żadnej z nich: [3]}

  • czy zamknięcie aplikacji z zasobnika systemowego prawidłowo zamyka otwarte formularze potomne?
  • czy aplikacja wymusza uruchamianie tylko jednej instancji (dotyczy większości, choć nie wszystkich, aplikacji w tray) ?
  • jak w razie potrzeby otworzyć okna potomne WPF oraz okna potomne WinForms.
  • Jak obsługiwać dynamiczne menu kontekstowe.
  • Standardowy NotifyIcon istnieje w przestrzeni WinForms; Czy Mogę zrobić czyste rozwiązanie WPF? (Tak, możesz!)

Właśnie opublikowałem artykuł na Simple-Talk.com to odnosi się do tych punktów i bardziej szczegółowo, zapewniając ramę aplikacji tray, które można natychmiast użyć, plus kompletny, rzeczywisty przykład aplikacji do pokazania wszystko w praktyce. Zobacz Creating Tray Applications in. NET: A Practical Guide, published November, 2010.

 146
Author: Michael Sorens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-05 16:57:13

Artykuł projektu kodu Tworzenie aplikacji Taskray daje bardzo proste wyjaśnienie i przykład tworzenia aplikacji, która zawsze istnieje tylko w zasobniku systemowym.

Zasadniczo Zmień linię Application.Run(new Form1()); w Program.cs, aby zamiast tego uruchomić klasę, która dziedziczy z ApplicationContext, i mieć konstruktor dla tej klasy initialize a NotifyIcon

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();
    }
}
 55
Author: Fawzan Izy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-27 11:53:01

Jak mówi mat1t-musisz dodać NotifyIcon do swojej aplikacji, a następnie użyć czegoś takiego jak poniższy kod, aby ustawić tooltip 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 tylko ikonę w zasobniku systemowym:

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

Następujące będą potrzebne, jeśli masz formularz (z jakiegokolwiek powodu):

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

Kliknięcie prawym przyciskiem myszy, aby uzyskać menu kontekstowe, jest obsługiwane automatycznie, ale jeśli chcesz wykonać jakąś akcję lewym przyciskiem myszy, musisz dodać obsługę 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;
        }
    }
 17
Author: ChrisF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 12:32:36

Napisałem aplikację traybar 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: NotifyIcon i ContextMenu.
Pamiętaj, aby dołączyć MenuItem" Quit " lub podobne.
Połącz ContextMenu z NotifyIcon.
Invoke Application.Run().
W obsłudze zdarzenia dla Quit MenuItem należy wywołać set NotifyIcon.Visible = False, a następnie Application.Exit(). Dodaj to, czego potrzebujesz do ContextMenu i obsłuż się poprawnie:)

 15
Author: M.Turrini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-21 12:23:28
  1. Utwórz nową aplikację Windows za pomocą Kreatora.
  2. Usuń Form1 z kodu.
  3. Usuń kod w programie.cs startuje Form1.
  4. Użyj klasy NotifyIcon, aby utworzyć ikonę w tacce systemowej(Przypisz do niej ikonę).
  5. Dodaj do niego contextmenu.
  6. lub react to NotifyIcon'S mouseclick and differenciate between Right and Left click, setting your contextmenu and showing it for which ever button (right/left) was Press.
  7. Application.Run() Aby zachować aplikacja uruchomiona z Application.Exit(), aby zakończyć. Lub while(bRunning){Application.DoEvents;Thread.Sleep(10);}. Następnie Ustaw bRunning = false, aby zamknąć aplikację.
 10
Author: Wolf5,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-21 12:20:25

Aplikacja "System tray" jest zwykłą aplikacją win forms, jedyną różnicą jest to, że tworzy ikonę w obszarze paska zadań systemu windows. W celu utworzenia sys.ikona w tacce użyj komponentu NotifyIcon, możesz go znaleźć w Toolbox (wspólne kontrolki) i zmodyfikować jego właściwości: ikona, podpowiedź. Umożliwia również obsługę kliknięć myszką i podwójnych kliknięć.

I jeszcze jedno, aby uzyskać wygląd i odczucia lub standardową aplikację tray. dodaj linie followinf do głównego formularza Zdarzenie:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 
 8
Author: Gordon Freeman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 09:44:57

Z tego, co wiem, musisz nadal pisać aplikację za pomocą formularza, ale nie masz kontroli nad formularzem i nigdy nie ustawiaj go jako widoczny. Użyj NotifyIcon (którego próbkę MSDN można znaleźć tutaj), aby napisać swoją aplikację.

 6
Author: Matthew Steeples,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-15 09:31:52

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

  1. Utwórz aplikację Windows Forms, Ustaw "Make single instance application" we właściwościach
  2. Dodaj ContextMenuStrip
  3. dodaj kilka wpisów do paska menu kontekstowego, kliknij na nie dwukrotnie, aby uzyskać programy obsługi, na przykład 'exit '(podwójne kliknięcie) - > handler - > me.Close ()
  4. Dodaj NotifyIcon, w designer set contextMenuStrip do tego, który właśnie stworzyłeś, wybierz ikonę (możesz znaleźć ją w Folder VisualStudio pod ' common7...')
  5. ustaw właściwości formularza w Projektancie: FormBorderStyle:none, ShowIcon:false, ShowInTaskbar:false, krycie:0%, WindowState: Minimalized
  6. Dodaj Mnie.Visible=false na końcu Form1_Load, spowoduje to ukrycie ikony, gdy użycie Ctrl + Tab
  7. Uruchom i dostosuj w razie potrzeby.
 2
Author: Evolved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 19:37:34

Jest to bardzo przyjazny framework dla aplikacji obszaru powiadomień... wystarczy dodać NotificationIcon do formularza bazowego 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;
        }
    }
}
 1
Author: Xawery Wiśniowiecki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 11:57:41

Po prostu dodaj

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

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

 0
Author: YTerle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-01 15:39:53