2008-09-05 42 views
59

Cách thích hợp để giảm thiểu ứng dụng WinForms xuống khay hệ thống là gì?Cách thích hợp để giảm thiểu tối đa khay ứng dụng C# WinForms là gì?

Lưu ý: thu nhỏ tối thiểu khay hệ thống; ở phía bên phải của thanh tác vụ theo đồng hồ. Tôi không hỏi về việc giảm thiểu thanh tác vụ, đó là những gì sẽ xảy ra khi bạn nhấn nút "trừ" trên cửa sổ.

Tôi đã thấy các giải pháp tấn công như "giảm thiểu, đặt ShowInTaskbar = false, sau đó hiển thị NotifyIcon của bạn".

Các giải pháp như vậy đang bị tấn công vì ứng dụng dường như không thu nhỏ đến khay giống như các ứng dụng khác, mã phải phát hiện khi nào đặt ShowInTaskbar = true, trong số các vấn đề khác.

Cách thích hợp để thực hiện việc này là gì?

+1

Ông có thể cung cấp tên của một ứng dụng mẫu thực hiện những gì bạn đang tìm kiếm. Tôi thực sự không nghĩ rằng có một cách "thích hợp" để làm điều này kể từ khi bạn thực sự không nên giảm thiểu các ứng dụng cho khu vực thông báo anyway. – Navaar

+1

Có lẽ bạn và tôi đang sử dụng các thuật ngữ khác nhau. Tôi đang nói về khu vực trong khay hệ thống, nơi các ứng dụng như WinRar, Vuze, Witty, Folding @ Home, v.v. giảm thiểu và/hoặc hiển thị thông tin. –

+0

Xin chào Giu-đa! Tôi chỉ xem hoạt ảnh trong hệ thống Windows 7 Ent (x64) của mình khi tôi thu nhỏ một số ứng dụng vào khay. Dường như tất cả những cái tôi đã kiểm tra đều sử dụng hình động gần. Nếu bạn nhìn kỹ, họ chỉ co lại thành không có gì. Tôi đã kiểm tra Skype và MS Office Communicator. Cả hai đều sử dụng hoạt ảnh gần. Tôi cũng đã kiểm tra Miranda Portable, nhưng nó không animate chút nào. Bạn có thể chỉ cho tôi một ứng dụng thực sự hoạt ảnh cho khay không? Dù sao, dựa trên những gì tôi thấy có vẻ như bạn chỉ cần đóng biểu mẫu của bạn và giữ cho luồng còn sống, được mô tả trong bài đăng của FlySwat. – alwayssummer

Trả lời

18

Có thực sự là không có cách nào quản lý để thực hiện điều đó dưới hình thức hoạt hình vào khay trong winforms mẹ đẻ, tuy nhiên bạn có thể P/Gọi shell32.dll để làm điều đó:

Một số thông tin tốt ở đây (Trong ý kiến ​​không phải là bưu điện):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

Và ở đây nó là trong C++:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

Bạn có thể sử dụng công cụ đó để tìm hiểu những thứ nào cần Pinvoke cho phiên bản C# của bạn.

+0

P/Gọi không phải là "hackish?" Đó là hackish hơn bằng cách sử dụng một số được xây dựng trong cách để làm điều này. :) – bugfixr

+6

Gọi đúng Win32 API không phải là hackish. Nó chỉ có nghĩa là các nhà thiết kế thư viện lớp cơ sở .NET đã bỏ lỡ khu vực này, không cho rằng nó đủ quan trọng để tự bọc nó. –

8
this.WindowState = FormWindowState.Minimized 

Đó là cách được xây dựng để thực hiện và có vẻ tốt với tôi hầu hết thời gian. Thời gian duy nhất là có một số weirdness với nó là nếu bạn gọi nó là khởi động trong đó có một số weirdness đôi khi đó là lý do tại sao hầu hết mọi người cũng sẽ thiết lập ShowInTaskbar = false và ẩn các hình thức quá.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

+1

Ryan, giúp giảm thiểu thanh tác vụ xuống thanh tác vụ chứ không phải khay hệ thống. Nếu bạn gọi thêm ShowInTaskbar = false, bạn sẽ gặp phải tình huống tấn công được mô tả trong bài đăng. Tôi muốn nó thực sự thu nhỏ vào khay hệ thống. Ví dụ. nếu tôi thu nhỏ, tôi muốn Windows cho thấy rằng nó đang thu nhỏ vào khay hệ thống, không phải thanh tác vụ hoặc trình đơn bắt đầu. Hầu hết các ứng dụng thu nhỏ đến khay làm việc này rất tốt; Windows thu nhỏ cửa sổ thu nhỏ vào khay hệ thống. Họ làm thế nào? –

3

Cập nhật: Hình như tôi đã đăng quá sớm. Tôi cũng đang sử dụng công cụ hack dưới đây cho một công cụ của tôi. Đang chờ giải pháp phù hợp cho điều này ..........

Bạn có thể sử dụng Windows.Forms.NotifyIcon cho việc này. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

Thêm NotifyIcon vào biểu mẫu, đặt một số thuộc tính và bạn đã hoàn tất.

 this.ShowIcon = false;//for the main form 
     this.ShowInTaskbar = false;//for the main form 
     this.notifyIcon1.Visible = true;//for notify icon 
     this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon 

    private void Form1_Shown(object sender, EventArgs e) 
    { 
     this.Hide(); 
    } 
+1

Gulzar, mã của bạn chính xác là kịch bản hackish mà tôi đã mô tả trong bài đăng. Có cách nào tốt hơn? Tôi đang tìm một * thực * thu nhỏ vào khay chứ không phải biểu tượng "thông báo hiển thị thông báo & không hiển thị" Hack. –

-1

Trong constructor của Mẫu:

this.Resize += new EventHandler(MainForm_Minimize); 

Sau đó sử dụng phương pháp này Event Handler:

private void MainForm_Minimize(object sender, EventArgs e) 
    { 
     if(this.WindowState == FormWindowState.Minimized) 
      Hide(); 
    } 
+0

Cấu trúc, đó không phải là những gì tôi đang tìm kiếm.Tôi cố gắng làm cho ứng dụng giảm thiểu tối đa để thử, sử dụng hoạt ảnh XP/Vista cho thấy nó sẽ chuyển đến khay. –

1

tương tự như trên ...

Tôi có một xử lý sự kiện thay đổi kích thước được kích hoạt bất cứ khi nào cửa sổ được thay đổi kích cỡ (Maximized, giảm thiểu, vv.) ...

public form1() 
    { 
     Initialize Component(); 

     this.Resize += new EventHanlder(form1_Resize); 
    } 


    private void form1_Resize(object sender, EventArgs e) 
    { 
     if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true) 
     { 
      NotificationIcon1.Visible = true; 
      NotificationIcon1.BalloonTipText = "Tool Tip Text" 
      NotificationIcon1.ShowBalloonTip(2); //show balloon tip for 2 seconds 
      NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds"; 
      this.WindowState = FormWindowState.Minimized; 
      this.ShowInTaskbar = false; 
     } 
    } 

Điều này cho phép người dùng lựa chọn hay không mà họ muốn giảm thiểu đến khay thông qua thanh thực đơn. Họ có thể vào Windows -> và bấm vào Minimize to Tray. Nếu điều này được chọn, và cửa sổ đang được thay đổi kích thước thành Tối thiểu hóa, sau đó cửa sổ sẽ thu nhỏ xuống khay. Làm việc hoàn hảo cho tôi.

+0

Kevin, tôi nghĩ bạn hiểu sai câu hỏi của tôi. Tôi yêu cầu một cách thích hợp để giảm thiểu. Bởi "thích hợp", tôi có nghĩa là có Windows chơi tối thiểu để khay hình ảnh động cho cửa sổ của bạn vì nó được giảm thiểu. Giải pháp của bạn đóng tiêu chuẩn "thu nhỏ thanh tác vụ" và sau đó thanh tác vụ biến mất. –

-1

Nếu bạn đang gặp khó khăn trong việc này để làm việc, kiểm tra xem bạn có

this.Resize += new System.EventHandler(this.Form1_Resize); 

trong fom1.designer.cs

5

Nó sẽ giúp,

public partial class Form1 : Form 
    { 
     public static bool Close = false; 
     Icon[] images; 
     int offset = 0; 


     public Form1() 
     { 
      InitializeComponent(); 

      notifyIcon1.BalloonTipText = "My application still working..."; 
      notifyIcon1.BalloonTipTitle = "My Sample Application"; 
      notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
     } 

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


     } 

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

     } 

     private void maximizeToolStripMenuItem_Click(object sender, EventArgs e) 
     { 

      this.Show(); 
      WindowState = FormWindowState.Normal; 
     } 

     private void closeToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Close = true; 
      this.Close(); 
     } 



     // Handle Closing of the Form. 
     protected override void OnClosing(CancelEventArgs e) 
     { 
      if (Close) 
      { 
       e.Cancel = false; 
      } 
      else 
      { 

       WindowState = FormWindowState.Minimized; 
       e.Cancel = true; 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      // Load the basic set of eight icons. 
      images = new Icon[5]; 
      images[0] = new Icon("C:\\icon1.ico"); 
      images[1] = new Icon("C:\\icon2.ico"); 
      images[2] = new Icon("C:\\icon3.ico"); 
      images[3] = new Icon("C:\\icon4.ico"); 
      images[4] = new Icon("C:\\icon5.ico"); 
     } 


     private void timer1_Tick(object sender, EventArgs e) 
     { 
      // Change the icon. 
      // This event handler fires once every second (1000 ms). 
      if (offset < 5) 
      { 
       notifyIcon1.Icon = images[offset]; 
       offset++; 
      } 
      else 
      { 
       offset = 0; 
      } 
     } 

    } 
+0

Đó là hack tôi đang nói đến. Nó không thực sự giảm thiểu để khay (nó giảm thiểu để thanh tác vụ) và liên quan đến mã hackish để hiển thị/ẩn biểu tượng trên thanh tác vụ. –

Các vấn đề liên quan