Bagaimana saya bisa membuat aplikasi .NET Windows Forms yang hanya berjalan di System Tray?

216

Apa yang harus saya lakukan untuk membuat aplikasi Windows Forms berjalan di System Tray?

Bukan aplikasi yang dapat meminimalkan ke baki, tetapi yang ada hanya di baki, dengan tidak lebih dari ikon, ujung alat, dan menu "klik kanan".

xyz
sumber
9
Ada sebagian besar jawaban yang hilang - jangan lupa untuk mengatur icon.Visible = false, lalu Dispose()ikon saat keluar dari aplikasi Anda. Kalau tidak, Anda masih akan melihat ikon setelah program Anda keluar. Setelah mengujinya beberapa kali, Anda tidak akan lagi tahu, ikon mana yang nyata.
Tomasz Gandor
Jika Anda mencari pendekatan WPF yang lebih modern - Anda dapat mencoba ini: codeproject.com/Articles/36788/…
Murray Foxcroft

Jawaban:

85

Artikel proyek kode Membuat Aplikasi Tasktray memberikan penjelasan yang sangat sederhana dan contoh membuat aplikasi yang hanya pernah ada di System Tray.

Pada dasarnya ubah Application.Run(new Form1());baris Program.csuntuk memulai sebuah kelas yang mewarisi ApplicationContext, dan minta konstruktor untuk kelas tersebut menginisialisasi aNotifyIcon

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
sumber
13
Ini adalah titik awal yang bagus. Perhatikan bahwa "AppIcon" harus nama sumber daya yang Anda tambahkan dengan "Project -> Properties -> Resources -> Add Resource", dan kemudian kompilasi ulang proyek.
Lavamantis
1
Saya melakukan properti .. sumber daya .. sumber daya tambahan .. ikon .. dikompilasi ulang, masih mendapatkan "Kesalahan CS0103 Nama 'Sumber Daya' tidak ada dalam konteks saat ini"
barlop
@barlop Saya harus menulis seperti ini: Properites.Resources.AppIcon
Simon Perepelitsa
@SimonPerepelitsa terima kasih, saya tidak yakin apa yang saya lakukan dalam eksperimen ini, saya bermaksud mengomentari apa yang berhasil tetapi saya pasti lupa beberapa hal yang saya lakukan itu berhasil. Tetapi pada akhirnya metode yang saya gunakan adalah menyeret ikon pemberitahuan dari palet hal-hal yang dapat Anda seret. Kemudian mengkliknya di formulir, mengklik panah kecil yang memunculkan menu untuk memilih ikon untuk itu!
barlop
17

Seperti kata mat1t - Anda perlu menambahkan NotifyIcon ke aplikasi Anda dan kemudian menggunakan sesuatu seperti kode berikut untuk mengatur tooltip dan menu konteks:

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

Kode ini hanya menampilkan ikon di baki sistem:

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

Berikut ini akan diperlukan jika Anda memiliki formulir (untuk alasan apa pun):

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

Klik kanan untuk mendapatkan menu konteks ditangani secara otomatis, tetapi jika Anda ingin melakukan beberapa tindakan pada klik kiri Anda harus menambahkan Click handler:

    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
sumber
15

Saya telah menulis aplikasi traybar dengan .NET 1.1 dan saya tidak memerlukan formulir.
Pertama-tama, tetapkan objek startup proyek sebagai Sub Main, didefinisikan dalam modul.
Kemudian buat secara pemrograman komponen: NotifyIcondan ContextMenu.
Pastikan untuk memasukkan MenuItem"Berhenti" atau yang serupa.
Bind ContextMenuke NotifyIcon.
Panggil Application.Run().
Di event handler untuk Quit MenuItempastikan untuk memanggil set NotifyIcon.Visible = False, lalu Application.Exit(). Tambahkan apa yang Anda butuhkan ContextMenudan tangani dengan benar :)

M.Turrini
sumber
11
  1. Buat Aplikasi Windows baru dengan wizard.
  2. Hapus Form1dari kode.
  3. Hapus kode di Program.cs memulai Form1.
  4. Gunakan NotifyIconkelas untuk membuat ikon baki sistem Anda (tetapkan ikon untuknya).
  5. Tambahkan menu konteks ke dalamnya.
  6. Atau bereaksi terhadap NotifyIconmouseklik dan membedakan antara klik kanan dan kiri, atur menu konteks Anda dan perlihatkan tombol mana yang pernah (kanan / kiri) ditekan.
  7. Application.Run()untuk menjaga aplikasi berjalan dengan Application.Exit()berhenti. Atau a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Kemudian atur bRunning = false;untuk keluar dari aplikasi.
Wolf5
sumber
Program berhenti dijalankan ketika Anda mencapai ujung Main dan tidak memiliki utas UI. Bagaimana Anda menangani ini adalah solusi Anda? Jika Anda telah memecahkan masalah tersebut maka Anda mendapatkan suara saya :)
Matthew Steeples
Anda mendapatkan suara saya. Mungkin hanya menyebutkan bahwa Anda masih perlu memanggil Application.Run tanpa params?
Diperbarui dengan alternatif untuk App.Run.
Wolf5
Thread.sleep terlalu berlebihan, saya tahu, tetapi jika Anda memiliki alternatif loop "tidur" yang lebih baik untuk Application.Run
postinglah
Thread.Tidur adalah ide yang buruk: Anda akan berakhir menggunakan lebih banyak CPU dan baterai daripada jika Anda baru saja melakukan Aplikasi. Berjalan seperti seharusnya.
Sneftel
8

Aplikasi "system tray" hanyalah aplikasi win form biasa, satu-satunya perbedaan adalah aplikasi ini membuat ikon di area system tray windows. Untuk membuat ikon sys.tray menggunakan komponen NotifyIcon, Anda dapat menemukannya di Toolbox (Kontrol umum), dan memodifikasi propertinya: Ikon, tip alat. Juga memungkinkan Anda untuk menangani pesan klik mouse dan klik dua kali.

Dan satu hal lagi, untuk mencapai tampilan dan nuansa atau aplikasi baki standar. tambahkan garis followinf pada acara acara utama Anda:

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

Sejauh yang saya ketahui Anda masih harus menulis aplikasi menggunakan formulir, tetapi tidak memiliki kontrol pada formulir dan tidak pernah mengaturnya terlihat. Gunakan NotifyIcon (contoh MSDN yang dapat ditemukan di sini ) untuk menulis aplikasi Anda.

Matthew Steeples
sumber
1
Tidak terlalu. Formulir Anda dapat berisi kontrol, tetapi harus disembunyikan secara default.
Rune Grimstad
5
Anda tidak perlu formulir apa pun. Setelah panduan pembuatan Aplikasi Window baru, hapus saja Form1 dan hapus kode yang membukanya. Anda dapat menulis semuanya dari Program.cs dengan NotifyIcon dan ContextMenu di atasnya. Tidak ada lagi yang dibutuhkan.
Wolf5
1
Saya tahu ini dapat berisi kontrol, tetapi OP tidak menginginkannya
Matthew Steeples
2

Inilah cara saya melakukannya dengan Visual Studio 2010 , .NET 4

  1. Buat Aplikasi Windows Forms, atur 'Make single instance application' di properti
  2. Tambahkan ContextMenuStrip
  3. Tambahkan beberapa entri ke strip menu konteks, klik dua kali pada mereka untuk mendapatkan penangan, misalnya, 'keluar' (klik dua kali) -> handler -> me.Close ()
  4. Tambahkan NotifyIcon, di designer set contextMenuStrip ke yang baru Anda buat, pilih ikon (Anda dapat menemukan beberapa di folder VisualStudio di bawah 'common7 ...')
  5. Tetapkan properti untuk formulir di desainer: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Diminimalkan
  6. Tambahkan Me.Visible = false di akhir Form1_Load, ini akan menyembunyikan ikon saat menggunakan Ctrl+Tab
  7. Jalankan dan sesuaikan sesuai kebutuhan.
Berkembang
sumber
2

Ini adalah kerangka kerja yang sangat ramah untuk Aplikasi Area Notifikasi ... cukup untuk menambahkan NotificationIcon ke form dasar dan ubah kode yang dibuat secara otomatis ke kode di bawah ini:

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
sumber
-2

Cukup tambahkan

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

ke objek formulir Anda. Anda hanya akan melihat ikon di baki sistem.

YTerle
sumber
Itu menempatkan formulir di atas taskbar. Bukan hal yang sama. Apakah Anda mencoba membalas posting lain?
LarsTech
1
Tidak ada ikon di bilah tugas, kami tidak melihat formulir. Program visual hanya ada di baki sistem. Apa yang dimaksud di atas ?
YTerle
Jawaban Anda tidak mengandung konteks apa pun. Apakah Anda menggunakan kelas NotifyIcon? Jika tidak, formulir Anda meminimalkan ke sudut kiri bawah di atas bilah tugas.
LarsTech
1
Jika Anda tidak sibuk, tolong, coba tulis dan jalankan.
YTerle