2010-01-06 32 views
6

Tôi đã thử nhiều thứ, nhưng không có công cụ nào trong số đó hoạt động ...không thể mang biểu mẫu đến trước

Tôi có Biểu mẫu phải có mặt trước tất cả Windows khi nhấp vào NotifyIcon. Vì vậy, đây là những gì tôi đã cố gắng:

private void notifyIcon1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     this.TopMost = true; 
     this.BringToFront(); 
     this.Focus(); 
     this.TopMost = false; 
    } 
} 

Sau đó, tôi cố gắng sử dụng SetForegroundWindow:

[return: MarshalAs(UnmanagedType.Bool)] 
[DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)] 
public static extern bool SetForegroundWindow(IntPtr hwnd); 

bằng cách thêm

 SetForegroundWindow(this.Handle); 

vào cuối nếu khối. Cuối cùng, tôi thấy rằng khi điều này không hoạt động nếu tôi nhấp vào nút chuột phải trên NotifyIcon và menu ngữ cảnh được mở ra, tôi có thể sau đó nhấp chuột trái NotifyIcon và nó mang nó đến phía trước.

Tôi đã cố gắng để thêm mã này ngay từ đầu:

 cmsNotifyIcon.Show(); 
     cmsNotifyIcon.Close(); 

Vì vậy mà nó cho thấy và đóng NotifyIcon menu ngữ cảnh, như một ý tưởng có thể cho khắc phục, nhưng nó không giúp đỡ.

Bất kỳ ý tưởng nào về cách thực hiện việc này hoặc giải quyết vấn đề này?

Trả lời

5

nếu bạn làm điều đó trên MouseUp thì sao?

+0

Ý tưởng hay, Kích hoạt() không thể khắc phục được. –

+0

Tôi có thể thử, nhưng tôi không có hy vọng cao trong điều này, bởi vì sự kiện MouseDown được kích hoạt, tôi có thể thấy rằng nếu tôi chèn điểm ngắt trong mã. Dù sao, vì điều này không xảy ra liên tục, tôi cần một thời gian để kiểm tra. –

+0

Tôi nghĩ rằng tôi đã có đủ quan sát để cho rằng đây sẽ là giải pháp cho vấn đề của tôi. Nếu vấn đề nào đó xuất hiện trở lại, tôi sẽ báo cáo. –

3

Đây là cách tôi đã thực hiện. Lưu ý rằng StartupWindowStateHideWhenMinimized là một thành viên riêng tư trong biểu mẫu của tôi.

private void OnOpenTrayMenuItemClicked(object sender, EventArgs e) { 
    if (this.WindowState == FormWindowState.Minimized) { 
     this.WindowState = this.StartupWindowState; 
     this.ShowInTaskbar = 
      (this.HideWhenMinimized && (this.WindowState == FormWindowState.Minimized)) ? false : true; 
     this.Show(); 
    } 

    this.Activate(); 
} 
+0

Như tôi đã trả lời dưới đây, tôi không nghĩ rằng điều này giải quyết được vấn đề của tôi - đây là mã để đưa biểu mẫu trước tất cả các biểu mẫu trong đơn đăng ký của bạn chứ không phải trước tất cả các cửa sổ của tất cả các ứng dụng nếu tôi đúng? –

+0

Có lẽ tôi đang thiếu điều gì đó trong yêu cầu của bạn. Nó sẽ không mang cửa sổ đến trước bất kỳ cửa sổ trên cùng nào đang mở (vì tôi tránh sử dụng 'TopMost' trong các ứng dụng của tôi). Tuy nhiên, khi tôi nhấp vào biểu tượng thông báo, điều này * có vẻ * để làm cho ứng dụng của tôi hoạt động, và mã ở trên đưa cửa sổ lên trước tất cả các cửa sổ không phải trên cùng, ngay cả những cửa sổ không phải là một phần của ứng dụng của tôi mà không Thất bại. –

+0

Tôi đã sai, tôi giải thích rằng với một câu trả lời tương tự như của bạn dưới đây, anzway bạn là đúng rằng điều này sẽ làm việc, nhưng lý do tại sao tôi đã có một vấn đề là tôi đã sử dụng sự kiện MouseDown và không MouseUp hoặc MouseClick như bạn đã làm. –

1

Sử dụng Activate() thay vì Hiển thị(). Ngoài ra nếu biểu mẫu của bạn được giảm thiểu, bạn phải đặt WindowState là WindowState.Normal (hoặc bất kỳ trạng thái nào trước khi thu nhỏ).

 

     private void notifyIcon1_Click(object sender, EventArgs e) 
     { 
      Activate(); 

      // this is needed for minimized form to show 
      WindowState = FormWindowState.Normal; 
     } 
 
+0

Tôi đã cố gắng thu nhỏ tất cả cửa sổ bằng start + d, nhấp vào informicon và có vẻ như hoạt động (có hoặc không mang cửa sổ khác lên trước), vì vậy tôi đoán đó không phải là vấn đề Mã này bạn cung cấp sẽ hoạt động nếu bạn không có bất kỳ ứng dụng nào khác chạy hơn ứng dụng của bạn, nhưng tôi không nghĩ rằng nó có thể mang đến trước tất cả các cửa sổ của tất cả các ứng dụng. –

+0

Nó sẽ đưa cửa sổ ứng dụng của bạn trước cửa sổ của tất cả các ứng dụng. Tôi đã thử nghiệm nó (Windows Vista). –

+0

Dường như MouseUp thay vì MouseDown đã giải quyết được vấn đề của tôi, nhưng tôi đoán rằng mã của bạn đơn giản hơn, vì vậy tôi cũng nên sử dụng nó. Tôi không chắc liệu nó có hoạt động được trên MouseDown hay không, tôi sẽ thử kiểm tra nó. –

0

Tôi gặp vấn đề tương tự; một cách giải quyết đơn giản sufficed cho tôi. Trong trình xử lý sự kiện mà tôi cần hiển thị biểu mẫu, tôi chỉ cần kiểm tra xem cửa sổ có hiển thị/bình thường hay không và nếu có thì tôi sẽ thu nhỏ nó. Phần còn lại của mã sau đó đưa nó trở lại.

private void OnDetails(object Sender, EventArgs Args) 
    { 
     if (DetailsForm == null) 
     { 
      DetailsForm = new MyForm(this); 
     } 

     if (DetailsForm.WindowState == FormWindowState.Normal) 
      DetailsForm.WindowState = FormWindowState.Minimized; 

     DetailsForm.WindowState = FormWindowState.Normal; 
     DetailsForm.Show(); 
    } 
0

Hãy thử điều này

Chức năng này làm việc cho tôi:

public static void BringFormToFront(Form form) { 

    form.Activate(); 
    form.TopMost = true; 
    form.TopMost = false; 
    form.Focus(); 
    form.BringToFront(); 

} 

và nếu bạn muốn trở thành phụ lười biếng:

public static void ShowFormToFront(Form form) { 
    form.Show(); 
    BringFormToFront(form); 
} 

Đây có thể dễ dàng được extension methods.

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