2008-10-17 30 views
8

Làm cách nào để có thể đưa cửa sổ ứng dụng bảng điều khiển lên phía trước trong C# (đặc biệt khi chạy trình gỡ rối Visual Studio)?đưa cửa sổ bảng điều khiển lên phía trước trong C#

+0

Trong bối cảnh nào và tại sao bạn muốn thực hiện việc này? Trong khi có trường hợp hợp pháp, thường là loại điều này là rắc rối hơn nó có giá trị. – ICR

Trả lời

16

Đó là hacky, thật khủng khiếp, nhưng nó làm việc cho tôi (nhờ, pinvoke.net!):

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Threading; 

public class Test 
{ 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    [DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)] 
    static extern IntPtr FindWindowByCaption(IntPtr zeroOnly, string lpWindowName); 

    public static void Main() 
    { 
     string originalTitle = Console.Title; 
     string uniqueTitle = Guid.NewGuid().ToString(); 
     Console.Title = uniqueTitle; 
     Thread.Sleep(50); 
     IntPtr handle = FindWindowByCaption(IntPtr.Zero, uniqueTitle); 

     if (handle == IntPtr.Zero) 
     { 
      Console.WriteLine("Oops, cant find main window."); 
      return; 
     } 
     Console.Title = originalTitle; 

     while (true) 
     { 
      Thread.Sleep(3000); 
      Console.WriteLine(SetForegroundWindow(handle)); 
     } 
    } 
} 
+0

Xin đừng bao giờ thêm mã này vào mã của bạn để nó xuất hiện trên đầu trang khi gỡ lỗi. – tvanfosson

+1

@tv - Có thể bạn có thể đưa ra lời giải thích cho tuyên bố tuyệt đối của bạn. Cá nhân tôi nghĩ rằng đây là việc sử dụng các chức năng quản lý cửa sổ hợp pháp và được khuyến nghị. Nó không phải là cách tiếp cận DRY tốt nhất nhưng với một chút refactoring nó là một thực tế phổ biến trong việc phát triển ứng dụng win32. Nó không phải là hackey, đó là cách bạn di chuyển các cửa sổ xung quanh màn hình nền. –

+0

chỉ để thêm, nếu bạn đang tìm cách để chạy mã này chỉ khi trong trình gỡ lỗi studio trực quan bạn có thể sử dụng như sau: if (Debugger.IsAttached == true) {...} –

1

Nhận hai màn hình (ít nhất) và VisualStudio mở trong màn hình phụ. Khi bạn chạy ứng dụng của bạn từ bên trong VisualStudio, nó sẽ khởi động theo mặc định trên màn hình chính. Vì đó là ứng dụng cuối cùng được mở, nó bắt đầu trên đầu và thay đổi sang VisualStudio không ảnh hưởng đến nó. Làm việc cho tôi anyway.

Nếu bạn chưa có màn hình thứ hai, IMHO, bạn nên làm như vậy.

6

Đây là những gì tôi sẽ làm.

[DllImport("kernel32.dll", ExactSpelling = true)] 
public static extern IntPtr GetConsoleWindow(); 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

public void BringConsoleToFront() 
{ 
    SetForegroundWindow(GetConsoleWindow()); 
} 
0

Khá một câu trả lời muộn, nhưng tôi đã sử dụng các công việc sau đây xung quanh:

Nếu bạn đang chạy một ứng dụng giao diện điều khiển với Windows Forms, và bạn muốn mang lại cho giao diện điều khiển phía trước của mẫu đơn, có không có cách nào lành mạnh để làm điều này, như chúng ta đã thấy ở trên. Tuy nhiên, có một cách để làm điều này với Windows Forms - bạn có thể sử dụng BringToFront()SendToBack() để thay đổi các lớp cửa sổ trong chương trình của bạn. Chương trình của tôi đã có một biểu mẫu và một giao diện điều khiển - giao diện điều khiển cần thiết ở phía trước, vì vậy tôi đã gửi biểu mẫu tới mặt sau.

Hạn chế: nếu người dùng của bạn đa nhiệm và bạn muốn bảng điều khiển ở phía trước mọi thứ, thao tác này sẽ không hoạt động. Tuy nhiên, nếu bạn chỉ muốn ảnh hưởng đến các cửa sổ trong chương trình của bạn, đây là một giải pháp thích hợp.

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