Yalnızca Sistem Tepsisinde çalışan bir .NET Windows Forms uygulamasını nasıl yapabilirim?


216

Bir Windows Forms uygulamasının Sistem Tepsisinde çalışmasını sağlamak için ne yapmam gerekir ?

Tepsiyi simge durumuna küçültebilecek bir uygulama değil, simge, araç ipucu ve "sağ tıklama" menüsünden başka bir şey olmadan yalnızca tepside bulunan bir uygulama.



9
Çoğu cevapta eksik bir şey var - ayarlamayı unutmayın icon.Visible = false, ardından Dispose()uygulamanızdan çıkarken simgesi. Aksi takdirde, programınız çıktıktan sonra simgeyi görmeye devam edersiniz. Birkaç kez test ettikten sonra, hangi simgenin gerçek olduğunu artık bilemezsiniz.
Tomasz Gandor

Daha modern bir WPF yaklaşımının peşindeyseniz
Murray Foxcroft

Yanıtlar:


86

Tasktray Uygulaması Oluşturma kod projesi makalesi , yalnızca Sistem Tepsisinde bulunan bir uygulamanın oluşturulmasına ilişkin çok basit bir açıklama ve örnek vermektedir.

Temel olarak Application.Run(new Form1());satırı Program.cs, devralınan bir sınıfı başlatmak için değiştirin ve ApplicationContexto sınıfın yapıcısının birNotifyIcon

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

13
Bu harika bir başlangıç ​​noktası. "AppIcon", "Proje -> Özellikler -> Kaynaklar -> Kaynak Ekle" ile eklediğiniz bir kaynağın adı olmalıdır ve sonra projeyi yeniden derleyin.
Lavamantis

1
Properties..resources..add resource..icon .. yeniden derledim, yine de "Hata CS0103" Kaynaklar "geçerli bağlamda mevcut değil"
barlop

@barlop Böyle yazmak zorunda kaldım: Properites.Resources.AppIcon
Simon Perepelitsa

@SimonPerepelitsa teşekkürler, deneylerimde ne yaptığımdan emin değilim, neyin işe yaradığını yorumlamak istedim ama çalıştığım şeylerden bazılarını unutmalıydım. Ama sonuçta kullandığım yöntem, sürükleyebileceğiniz şeylerin paletinden bir bildirim simgesi sürüklemekti. Sonra formun üzerine tıklayarak, onun için bir simge seçmek için bir menü getiren küçük bir oka tıklayın!
barlop

17

Mat1t'in söylediği gibi - uygulamanıza bir NotifyIcon eklemeniz ve ardından araç ipucu ve bağlam menüsünü ayarlamak için aşağıdaki kod gibi bir şey kullanmanız gerekir:

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

Bu kod yalnızca sistem tepsisindeki simgeyi gösterir:

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

Bir formunuz varsa (herhangi bir nedenle) aşağıdakilere ihtiyaç duyulacaktır:

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

Bağlam menüsünü almak için sağ tıklama otomatik olarak işlenir, ancak sol tıklamayla bazı işlemler yapmak istiyorsanız bir Tıklama işleyicisi eklemeniz gerekir:

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

15

.NET 1.1 ile bir tepsi çubuğu uygulaması yazdım ve bir forma ihtiyacım yoktu.
Her şeyden önce, projenin başlangıç ​​nesnesini Mainbir modülde tanımlanan bir Sub olarak ayarlayın .
Ardından bileşenleri programlı olarak oluşturun: NotifyIconve ContextMenu. "Çık" veya benzeri
bir MenuItemöğe eklediğinizden emin olun .
Bind ContextMenuiçin NotifyIcon.
Çağır Application.Run().
Quit için olay işleyicide MenuItemayarladığınızdan emin olun NotifyIcon.Visible = False, sonra Application.Exit(). İhtiyacınız olanı ekleyin ContextMenuve düzgün bir şekilde kullanın :)


11
  1. Sihirbazla yeni bir Windows Uygulaması oluşturun.
  2. Sil Form1 .
  3. Program.cs dosyasındaki kodu kaldırın. Form1 .
  4. Kullan NotifyIconSistem tepsisi simgenizi oluşturmak için sınıfı (simgeye bir simge atayın).
  5. Bir bağlam menüsü ekleyin.
  6. Veya NotifyIcon sağ ve Sol tıklama arasındaki fare tıklamasına ve farklılığına verin, bağlam menünüzü ayarlayın ve hangi düğmeye (sağ / sol) basıldığını gösterin.
  7. Application.Run()uygulamadan Application.Exit()çıkmaya devam etmesini sağlamak için . Veya a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Sonra bRunning = false;uygulamadan çıkmak için ayarlayın .

Main sonuna geldiğinizde ve UI iş parçacığı olmadığında program yürütmeyi durdurur. Bu çözümünüzle nasıl ilgileniyorsunuz? Bu sorunları
çözdüysen,

Benim oyumu aldın. Belki de hala Application.Run'u herhangi bir parametresiz çağırmanız gerektiğini belirtin?

App.Run alternatifi ile güncellendi.
Wolf5

Thread.sleep overkill biliyorum, ama eğer daha iyi bir "uyku" döngü Application.Run yapmak alternatif var :)
Wolf5

Thread.Sleep kötü bir fikirdir: Uygulama yaptığınızdan daha fazla CPU ve pil kullanırsınız.
Sneftel

8

"Sistem tepsisi" uygulaması sadece normal bir kazanç formları uygulaması, tek fark windows sistem tepsisi alanında bir simge oluşturmaktır. Sys.tray simgesi oluşturmak için NotifyIcon bileşenini kullanın, bunu Toolbox'ta (Ortak kontroller) bulabilir ve özelliklerini değiştirebilirsiniz: Simge, araç ipucu. Ayrıca fare tıklatma ve çift tıklama iletilerini işlemenizi sağlar.

Ve bir şey daha, görünüm ve hisler elde etmek için veya standart tepsi uygulaması. ana form gösterisi etkinliğinize followinf satırları ekleyin:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 

6

Bildiğim kadarıyla hala bir form kullanarak uygulamayı yazmak zorunda, ancak form üzerinde herhangi bir denetime sahip ve asla görünür ayarla. Uygulamanızı yazmak için NotifyIcon'u ( burada bulunan bir MSDN örneği ) kullanın.


1
Pek değil. Formlarınız kontroller içerebilir, ancak varsayılan olarak gizlenmelidir.
Rune Grimstad

5
Herhangi bir forma ihtiyacınız yoktur. Yeni bir Pencere Uygulaması oluşturma sihirbazından sonra Form1'i silin ve onu açan kodu kaldırın. Hepsini NotifyIcon ve ContextMenu ile Program.cs'den yazabilirsiniz. Başka bir şey gerekli değil.
Wolf5

1
Kontroller içerebileceğini biliyorum, ama OP bunu istemiyor
Matthew Steeples

2

Visual Studio 2010 , .NET 4 ile böyle yaptım

  1. Bir Windows Forms Uygulaması oluşturun, özelliklerde 'Tek örnekli uygulama yap' seçeneğini ayarlayın
  2. ContextMenuStrip Ekle
  3. Bağlam menüsü şeridine bazı girişler ekleyin, işleyicileri almak için üzerlerine çift tıklayın, örneğin 'çıkış' (çift tıklama) -> işleyici -> me.Close ()
  4. Bir NotifyIcon ekleyin, oluşturduğunuz tasarımcıya contextMenuStrip tasarımcı kümesinde bir simge seçin (VisualStudio klasöründe 'common7 ...' altındaki bazılarını bulabilirsiniz)
  5. Tasarımcıdaki form özelliklerini ayarlama: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opaklık: 0%, WindowState: Minimize
  6. Add Me.Visible = false Form1_Load sonunda, bu kullanıldığında simgeyi gizler Ctrl +Tab
  7. Çalıştırın ve gerektiği gibi ayarlayın.

2

Bildirim Alanı Uygulaması için çok kolay bir çerçevedir ... temel forma NotificationIcon eklemek ve otomatik olarak oluşturulan kodu aşağıdaki koda değiştirmek yeterlidir:

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

-2

Basitçe ekleyin

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

form nesnenize. Sistem tepsisinde yalnızca bir simge göreceksiniz.


Bu, formu görev çubuğunun üstüne koyar . Aynı şey değil. Başka bir gönderiyi yanıtlamaya mı çalışıyorsunuz?
LarsTech

1
Görev çubuğunda bir simge yok, form görmüyoruz. Görsel olarak program sadece sistem tepsisinde bulunur. Yukarıda ne demek?
YTerle

Cevabınız herhangi bir bağlam içermiyor. NotifyIcon sınıfını mı kullanıyorsunuz? Aksi takdirde, formunuz görev çubuğunun üzerindeki sol alt köşeye küçülür.
LarsTech

1
Meşgul değilseniz, lütfen yazmaya ve çalıştırmaya çalışın.
YTerle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.