Làm cách nào để tạo ứng dụng .NET Windows Forms chỉ chạy trong Khay hệ thống?


216

Tôi cần làm gì để ứng dụng Windows Forms chạy trong Khay hệ thống?

Không phải là một ứng dụng có thể thu nhỏ vào khay, mà là một ứng dụng chỉ tồn tại trong khay, không có gì khác ngoài biểu tượng, mẹo công cụ và menu "nhấp chuột phải".



9
Có một cái gì đó bị thiếu trong hầu hết các câu trả lời - đừng quên đặt icon.Visible = false, sau đó Dispose()là biểu tượng khi thoát khỏi ứng dụng của bạn. Nếu không, bạn vẫn sẽ thấy biểu tượng sau khi chương trình của bạn thoát. Sau khi thử nghiệm một vài lần, bạn sẽ không còn biết biểu tượng nào là thật nữa.
Tomasz Gandor

Nếu bạn theo đuổi cách tiếp cận WPF hiện đại hơn - bạn có thể thử cách này: codeproject.com/Articles/36788/iêu
Murray Foxcroft

Câu trả lời:


85

Bài viết dự án mã Tạo ứng dụng tác vụ đưa ra một lời giải thích và ví dụ rất đơn giản về việc tạo một ứng dụng chỉ tồn tại trong Khay hệ thống.

Về cơ bản thay đổi Application.Run(new Form1());dòng vào Program.csđể thay vào đó khởi động một lớp kế thừa từ đó ApplicationContextvà có hàm tạo cho lớp đó khởi tạo mộtNotifyIcon

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
Đây là một điểm khởi đầu tuyệt vời. Lưu ý rằng "AppIcon" phải là tên của tài nguyên mà bạn thêm bằng "Dự án -> Thuộc tính -> Tài nguyên -> Thêm tài nguyên", sau đó biên dịch lại dự án.
Lavamantis

1
Tôi đã làm tài sản..resource..add resource..icon .. được biên dịch lại, vẫn nhận được "Lỗi CS0103 Tên 'Tài nguyên' không tồn tại trong bối cảnh hiện tại"
barlop

@barlop tôi đã phải viết nó như thế này: Properites.Resources.AppIcon
Simon Perepelitsa

@SimonPerepelitsa cảm ơn, tôi không chắc mình đã làm gì trong các thí nghiệm của mình, tôi muốn bình luận những gì hiệu quả nhưng tôi phải quên một số điều tôi đã làm. Nhưng cuối cùng, phương pháp tôi đã sử dụng là kéo một biểu tượng đáng chú ý từ bảng màu của những thứ bạn có thể kéo vào. Sau đó nhấp vào biểu mẫu trên biểu mẫu, nhấp vào một mũi tên nhỏ sẽ hiển thị menu để chọn biểu tượng cho nó!
barlop

17

Như mat1t đã nói - bạn cần thêm một Thông báo cho ứng dụng của mình và sau đó sử dụng một cái gì đó giống như đoạn mã sau để đặt menu công cụ và ngữ cảnh:

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

Mã này chỉ hiển thị biểu tượng trong khay hệ thống:

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

Sau đây sẽ là cần thiết nếu bạn có một hình thức (vì bất kỳ lý do gì):

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

Nhấp chuột phải để nhận menu ngữ cảnh được xử lý tự động, nhưng nếu bạn muốn thực hiện một số hành động trên một nhấp chuột trái, bạn sẽ cần thêm một trình xử lý Nhấp chuột:

    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

Tôi đã viết một ứng dụng thanh khay với .NET 1.1 và tôi không cần một biểu mẫu.
Trước hết, đặt đối tượng khởi động của dự án là Sub Main, được xác định trong một mô-đun.
Sau đó tạo lập trình các thành phần: NotifyIconContextMenu.
Hãy chắc chắn bao gồm một MenuItem"Thoát" hoặc tương tự.
Ràng buộc ContextMenuvới NotifyIcon.
Gọi Application.Run().
Trong xử lý sự kiện cho Quit MenuItemhãy chắc chắn để gọi thiết lập NotifyIcon.Visible = False, sau đó Application.Exit(). Thêm những gì bạn cần vào ContextMenuvà xử lý đúng cách :)


10
  1. Tạo một ứng dụng Windows mới với trình hướng dẫn.
  2. Xóa Form1khỏi mã.
  3. Xóa mã trong Program.cs bắt đầu lên Form1.
  4. Sử dụng NotifyIconlớp để tạo biểu tượng khay hệ thống của bạn (gán biểu tượng cho nó).
  5. Thêm một bối cảnh cho nó.
  6. Hoặc phản ứng với NotifyIconmouseclick và khác biệt giữa Nhấp chuột phải và Nhấp chuột trái, đặt bối cảnh của bạn và hiển thị nút bấm nào (phải / trái) được nhấn.
  7. Application.Run()để giữ cho ứng dụng chạy với Application.Exit()để thoát. Hoặc a bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. Sau đó thiết lập bRunning = false;để thoát khỏi ứng dụng.

Chương trình dừng thực thi khi bạn đến cuối Main và không có luồng UI. Làm thế nào để bạn chăm sóc đây là giải pháp của bạn? Nếu bạn đã giải quyết được những vấn đề đó thì bạn sẽ nhận được phiếu bầu của tôi :)
Matthew Steeples

Bạn nhận được phiếu bầu của tôi. Có lẽ chỉ cần đề cập rằng bạn vẫn cần gọi Application.Run mà không cần bất kỳ thông số nào?

Cập nhật với một thay thế cho App.Run.
Wolf5

Tôi biết rằng chủ đề ngủ quá mức cần thiết, nhưng nếu bạn có một vòng lặp "ngủ" tốt hơn cho Application.Run hãy đăng nó :)
Wolf5

Thread.S ngủ là một ý tưởng tồi: cuối cùng bạn sẽ sử dụng nhiều CPU và pin hơn so với khi bạn vừa làm Application.Run giống như bạn dự định.
Sneftel

8

Ứng dụng "Khay hệ thống" chỉ là một ứng dụng win form thông thường, chỉ khác là nó tạo ra một biểu tượng trong khu vực khay hệ thống của windows. Để tạo biểu tượng sys.tray, hãy sử dụng thành phần NotifyIcon, bạn có thể tìm thấy nó trong Hộp công cụ (Điều khiển chung) và sửa đổi các thuộc tính của nó: Biểu tượng, mẹo công cụ. Ngoài ra, nó cho phép bạn xử lý các thông báo nhấp chuột và nhấp đúp chuột.

Và một điều nữa, để đạt được giao diện hoặc ứng dụng khay tiêu chuẩn. thêm dòng followinf vào sự kiện hiển thị biểu mẫu chính của bạn:

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

6

Theo như tôi biết, bạn vẫn phải viết ứng dụng bằng một biểu mẫu, nhưng không có điều khiển nào trên biểu mẫu và không bao giờ đặt nó hiển thị. Sử dụng NotifyIcon (một mẫu MSDN có thể tìm thấy ở đây ) để viết ứng dụng của bạn.


1
Không hẳn. (Các) biểu mẫu của bạn có thể chứa các điều khiển, nhưng nó phải được ẩn theo mặc định.
Rune Grimstad

5
Bạn không cần bất kỳ hình thức. Sau trình hướng dẫn tạo ứng dụng Window mới, chỉ cần xóa Form1 và xóa mã mở nó. Bạn có thể viết tất cả từ Program.cs với NotifyIcon và ContextMothy trên đó. Không có gì hơn yêu cầu.
Wolf5

1
Tôi biết nó có thể chứa các điều khiển, nhưng OP không muốn nó
Matthew Steeples

2

Đây là cách tôi đã làm với Visual Studio 2010 , .NET 4

  1. Tạo Ứng dụng Windows Forms, đặt 'Tạo ứng dụng đơn lẻ' trong thuộc tính
  2. Thêm một ContextMothyStrip
  3. Thêm một số mục vào dải menu ngữ cảnh, nhấp đúp vào chúng để lấy các trình xử lý, ví dụ: 'exit' (nhấp đúp) -> handler -> me.C Đóng ()
  4. Thêm một Thông báo, trong trình thiết kế, đặt ngữ cảnhMaxStrip vào biểu tượng bạn vừa tạo, chọn một biểu tượng (bạn có thể tìm thấy một số trong thư mục VisualStudio trong 'common7 ...')
  5. Đặt thuộc tính cho biểu mẫu trong trình thiết kế: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Thu nhỏ
  6. Thêm Me.Visible = false vào cuối Form1_Load, điều này sẽ ẩn biểu tượng khi sử dụng Ctrl+Tab
  7. Chạy và điều chỉnh khi cần thiết.

2

Đó là khung rất thân thiện cho Ứng dụng Khu vực Thông báo ... đủ để thêm Thông báo vào biểu mẫu cơ sở và thay đổi mã được tạo tự động thành mã bên dưới:

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

Đơn giản chỉ cần thêm

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

để đối tượng hình thức của bạn. Bạn sẽ chỉ thấy một biểu tượng trên khay hệ thống.


Điều đó đặt các hình thức trên thanh tác vụ. Không giống nhau. Bạn đang cố gắng trả lời một bài viết khác?
LarsTech

1
Không có biểu tượng trên thanh tác vụ, chúng tôi không thấy biểu mẫu. Chương trình trực quan chỉ tồn tại ở khay hệ thống. Những gì hiện trên nghĩa là gì?
YTerle

Câu trả lời của bạn không chứa bất kỳ bối cảnh nào. Bạn đang sử dụng lớp NotifyIcon? Nếu không, biểu mẫu của bạn chỉ thu nhỏ ở góc dưới bên trái phía trên thanh tác vụ.
LarsTech

1
Nếu bạn không bận, xin vui lòng, cố gắng viết và chạy nó.
YTerle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.