2010-08-26 82 views
138

Tôi tìm kiếm thông tin về cách ẩn cửa sổ bảng điều khiển của chính mình. Thật ngạc nhiên, các giải pháp duy nhất tôi có thể tìm thấy là các giải pháp hacky có liên quan đến FindWindow() để tìm cửa sổ bảng điều khiển theo tiêu đề. Tôi đào sâu hơn một chút vào Windows API và thấy rằng có một cách tốt hơn và dễ dàng hơn nhiều, vì vậy tôi muốn đăng nó ở đây để những người khác tìm thấy.Hiển thị/Ẩn cửa sổ bảng điều khiển của ứng dụng giao diện điều khiển C#

Làm cách nào để ẩn (và hiển thị) cửa sổ bảng điều khiển được liên kết với ứng dụng giao diện điều khiển C# của riêng tôi?

Trả lời

180

Đây là cách:

using System.Runtime.InteropServices; 

[DllImport("kernel32.dll")] 
static extern IntPtr GetConsoleWindow(); 

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

const int SW_HIDE = 0; 
const int SW_SHOW = 5; 

var handle = GetConsoleWindow(); 

// Hide 
ShowWindow(handle, SW_HIDE); 

// Show 
ShowWindow(handle, SW_SHOW); 
+3

Cửa sổ vẫn xuất hiện trong giây lát lúc đầu. Tôi đoán không có cách nào xung quanh điều này, trừ khi loại ứng dụng được thay đổi? –

+1

Nó sẽ là tốt đẹp nếu có một cách xung quanh đó. Bằng cách đó tôi có thể hiển thị giao diện điều khiển khi tôi đang ở chế độ gỡ lỗi, nhưng chỉ cần chạy chương trình của tôi và thoát (không có cửa sổ) khi tôi đang ở chế độ chạy bình thường. – Vaccano

+6

@Vaccano: Có thể làm cho ứng dụng của bạn trở thành ứng dụng bảng điều khiển trong chế độ Gỡ lỗi chỉ bằng cách chỉnh sửa tệp 'csproj' theo cách thủ công. Visual Studio không có GUI để làm điều này, nhưng nó sẽ tôn trọng cài đặt nếu bạn chỉnh sửa tệp 'csproj' chính xác. – Timwi

174

Chỉ cần vào Thuộc tính của ứng dụng và thay đổi kiểu Output từ Console Application đến Ứng dụng Windows.

+0

Tôi cảm thấy như một chút numpty, nó có vẻ như vậy rõ ràng khi chỉ ra cho tôi. Tôi thấy điều này rất khó để google. – Crouch

+2

Mặc dù điều này không trả lời câu hỏi của OP, tôi thực sự đánh giá cao bạn đưa ra câu trả lời này. Đó là chính xác những gì tôi cần :) –

+1

u làm ngày của tôi :) Cảm ơn –

19

Tại sao bạn cần ứng dụng bảng điều khiển nếu bạn muốn ẩn giao diện điều khiển? =)

Tôi khuyên bạn nên đặt Loại kết xuất dự án thành Ứng dụng Windows thay vì ứng dụng Bảng điều khiển. Nó sẽ không hiển thị cửa sổ bảng điều khiển của bạn, nhưng thực thi tất cả các hành động, như ứng dụng Console làm.

+16

Vì có thể có một thời gian khi tôi thực sự muốn hiển thị nó. Giống như, ứng dụng giao diện điều khiển cố gắng thực hiện nội dung và không làm phiền bất kỳ ai khi nó thành công. Nếu không, nó bật lên và cung cấp cho tôi một CLI. –

8

Xem bài của tôi ở đây:

Show Console in Windows Application

Bạn có thể tạo một ứng dụng Windows (có hoặc không có cửa sổ) và hiển thị giao diện điều khiển như mong muốn. Sử dụng phương pháp này cửa sổ giao diện điều khiển không bao giờ xuất hiện trừ khi bạn hiển thị nó một cách rõ ràng. Tôi sử dụng nó cho các ứng dụng chế độ kép mà tôi muốn chạy trong giao diện điều khiển hoặc chế độ gui tùy thuộc vào cách chúng được mở.

+0

hoàn hảo, cảm ơn bạn! –

+0

Tuyệt vời! cách dễ nhất để ẩn giao diện điều khiển là thay đổi loại dự án thành ứng dụng Windows. –

0

Nếu bạn không muốn phụ thuộc vào cửa sổ sử dụng danh hiệu này:

[DllImport("user32.dll")] 
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

...

IntPtr h = Process.GetCurrentProcess().MainWindowHandle; 
    ShowWindow(h, 0); 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new FormPrincipale()); 
+0

chúng tôi phải cung cấp đường dẫn đầy đủ của tệp dll trong DllImport ("fullPath") / –

0

Nếu bạn không có một vấn đề tích hợp một ứng dụng hàng loạt nhỏ, có chương trình này được gọi là Cmdow.exe sẽ cho phép bạn ẩn cửa sổ bảng điều khiển dựa trên tiêu đề bảng điều khiển.

Console.Title = "MyConsole"; 
System.Diagnostics.Process HideConsole = new System.Diagnostics.Process(); 
HideConsole.StartInfo.UseShellExecute = false; 
HideConsole.StartInfo.Arguments = "MyConsole /hid"; 
HideConsole.StartInfo.FileName = "cmdow.exe"; 
HideConsole.Start(); 

Thêm exe với các giải pháp, thiết lập các hành động xây dựng để "Nội dung", thiết lập Copy to Output Directory để những gì phù hợp với bạn, và cmdow sẽ ẩn cửa sổ giao diện điều khiển khi nó được chạy.

Để làm cho giao diện điều khiển có thể nhìn thấy một lần nữa, bạn chỉ cần thay đổi Arguments

HideConsole.StartInfo.Arguments = "MyConsole /Vis"; 
12

Bạn có thể làm đảo ngược và thiết lập các ứng dụng loại đầu ra: Windows Application. Sau đó, thêm mã này vào đầu ứng dụng.

[DllImport("kernel32.dll", EntryPoint = "GetStdHandle", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern IntPtr GetStdHandle(int nStdHandle); 

[DllImport("kernel32.dll", EntryPoint = "AllocConsole", SetLastError = true, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern int AllocConsole(); 

private const int STD_OUTPUT_HANDLE = -11; 
private const int MY_CODE_PAGE = 437; 
private static bool showConsole = true; //Or false if you don't want to see the console 

static void Main(string[] args) 
{ 
    if (showConsole) 
    { 
     AllocConsole(); 
     IntPtr stdHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
     Microsoft.Win32.SafeHandles.SafeFileHandle safeFileHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(stdHandle, true); 
     FileStream fileStream = new FileStream(safeFileHandle, FileAccess.Write); 
     System.Text.Encoding encoding = System.Text.Encoding.GetEncoding(MY_CODE_PAGE); 
     StreamWriter standardOutput = new StreamWriter(fileStream, encoding); 
     standardOutput.AutoFlush = true; 
     Console.SetOut(standardOutput); 
    } 

    //Your application code 
} 

Mã này sẽ hiển thị Console nếu showConsoletrue

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