thu nhỏ ứng dụng vào khay hệ thống


114

Tôi có ứng dụng biểu mẫu Windows được hỗ trợ bởi C # và Visual Studio 2010.

Làm cách nào để thu nhỏ ứng dụng của tôi xuống khay hệ thống (không phải thanh tác vụ), sau đó đưa ứng dụng trở lại khi nhấp đúp vào khay hệ thống? bất kỳ ý tưởng? Ngoài ra, làm cách nào tôi có thể tạo một số menu trong biểu tượng trên khay hệ thống và khi tôi nhấp chuột phải vào nó, nó sẽ hiển thị một menu như Đăng nhập, Ngắt kết nối, Kết nối, đại loại như vậy. Ngoài ra, có bất kỳ phương pháp nào để hiển thị giống như một cái baloon bật lên từ khay hệ thống không?

Tái bút: Tôi đã thêm mộttifyIcon, nhưng tôi không biết cách sử dụng nó.


Tại đây, bạn có thể tải xuống mã mẫu tuyệt vời simple-talk.com/dotnet/.net-framework/…
Nhà phát triển

Bạn sẽ muốn chắc chắn truy cập Designer.cs của biểu mẫu và "đăng ký" trình xử lý sự kiện hoặc không có cái nào trong số này sẽ hoạt động (tôi không thể tìm ra). Bạn có thể làm điều này bằng cách thêm một cái gì đó như sau: this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Brad

Câu trả lời:


149

Xử lý sự kiện Thay đổi kích thước của biểu mẫu. Trong trình xử lý này, bạn ghi đè chức năng cơ bản của sự kiện Thay đổi kích thước để làm cho biểu mẫu được thu nhỏ xuống khay hệ thống chứ không phải thanh tác vụ. Điều này có thể được thực hiện bằng cách thực hiện như sau trong trình xử lý sự kiện Thay đổi kích thước của biểu mẫu của bạn: Kiểm tra xem thuộc tính WindowState của biểu mẫu có được đặt thành FormWindowState.Minimized hay không. Nếu có, hãy ẩn biểu mẫu của bạn, bật đối tượng NotifyIcon và hiển thị đầu bong bóng hiển thị một số thông tin. Khi WindowState trở thành FormWindowState.Normal, hãy vô hiệu hóa đối tượng NotifyIcon bằng cách đặt thuộc tính Visible của nó thành false. Bây giờ, bạn muốn cửa sổ xuất hiện lại khi bạn nhấp đúp vào đối tượng NotifyIcon trên thanh tác vụ. Đối với điều này, hãy xử lý sự kiện MouseDoubleClick của NotifyIcon. Tại đây, bạn hiển thị biểu mẫu bằng phương thức Show ().

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

5
bạn có thể thay đổi Thuộc tính Form.FormBorderStyle msdn.microsoft.com/en-us/library/…
CD ..

tnx! nó đã hoạt động .. cũng có bất kỳ ý tưởng nào để vô hiệu hóa các nút thu nhỏ, đóng, tối đa hóa đó ở trên cùng phải không? tnx
WantIt


tnx nó cũng hoạt động! Ngoài ra, khi tôi nhấp đúp vào biểu tượng trên khay hệ thống, cửa sổ không nằm trên cùng với các ứng dụng khác, tôi phải mất công nhấp vào cửa sổ trên thanh tác vụ để nó hiển thị. Làm thế nào chúng ta có thể xử lý điều này? tnx rất nhiều
WantIt


69

Tôi tìm thấy điều này để hoàn thành toàn bộ giải pháp. Câu trả lời ở trên không thể xóa cửa sổ khỏi thanh tác vụ.

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

Ngoài ra, bạn nên đặt các thuộc tính sau của điều khiển biểu tượng thông báo bằng trình thiết kế biểu mẫu.

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

7
Bạn đã mất tích this.Show();trước đâythis.WindowState = FormWindowState.Normal;
developerwjk

1
Đánh máy trong "người dùng không quan tâm". ;)
Andrew

1
@developerwjk, không thiếu vì anh ấy không gọi Hide(). Nhưng vấn đề với cách tiếp cận đó là cửa sổ vẫn xuất hiện khi bạn nhấn Alt-Tab. Tôi thích gọi hơn Hide()và theo cách đó bạn không phải sử dụng ShowInTaskbartài sản nào cả.
Andrew

@Andrew Tôi đang gặp sự cố khi sử dụng Show()Hide(); sau khi ẩn, hiển thị và sau đó ẩn, nó sẽ không hiển thị lại.
newbieguy

@newbieguy, tôi đoán bạn cần tạo một câu hỏi mới vì vấn đề của bạn không phù hợp để nhận xét về câu trả lời. Bạn sẽ cần cung cấp thêm thông tin, như mã bạn đang sử dụng. Bạn có thể bao gồm một liên kết đến câu trả lời mà bạn đã cố gắng sử dụng.
Andrew

17

Tôi sẽ đi với

private void Form1_Resize(object sender, EventArgs e)
{
     if (FormWindowState.Minimized == this.WindowState)
     {
          notifyIcon1.Visible = true;
          notifyIcon1.ShowBalloonTip(500);
          this.Hide();    
     }
     else if (FormWindowState.Normal == this.WindowState)
     {
          notifyIcon1.Visible = false;
     }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}

17

đừng quên thêm tệp biểu tượng vào InformIcon của bạn nếu không nó sẽ không xuất hiện trong khay.


phần cần thiết nhất trong chủ đề. Bạn có thể thêm một chút thông tin, làm thế nào để buộc nó sử dụng biểu tượng mặc định?
T.Todua

12

thử cái này

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

1
Nếu bạn chỉ ẩn khỏi thanh tác vụ thay vì gọi this.Hide(), cửa sổ vẫn xuất hiện khi thực hiện Alt-Tab.
Andrew

3

Đây là phương pháp tôi sử dụng trong các ứng dụng của mình, nó khá đơn giản và có thể tự giải thích được nhưng tôi rất vui được cung cấp thêm chi tiết để trả lời các nhận xét của bạn.

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }

2
Giải pháp này và các giải pháp khác có một vấn đề: nếu biểu mẫu bị ẩn dưới các cửa sổ khác, người dùng rất có thể không muốn thu nhỏ nó khi nhấp vào biểu tượng. Thay vào đó, nó nên được tập trung. Xem câu hỏi của tôi tại đây: stackoverflow.com/questions/36797442/…
maf-soft

1

Khi nhấp vào hình ảnh trong khay Hệ thống, bạn có thể xác minh xem khung có hiển thị hay không và sau đó bạn phải đặt Visible = true hoặc false


1

... và đối với menu thông báo khi nhấp chuột phải của bạn, hãy thêm menu ngữ cảnh vào biểu mẫu và chỉnh sửa nó và đặt các sự kiện mouseclick cho từng contextmenuitems bằng cách nhấp đúp vào chúng và sau đó đính kèm nó vào Informicon1 bằng cách chọn ContextMenuStrip trong thuộc tính Informicon.


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.