2013-01-07 34 views
6

thể trùng lặp:
How do I show console output/window in a forms application?Viết ra để giao diện điều khiển từ một ứng dụng C# winforms

Có cách nào cho một c chương trình # winforms ghi vào sổ giao diện điều khiển?

+2

đẹp bưu điện, nhưng nó đã được hỏi ở đây: http://stackoverflow.com/questions/4362111/how-do-i-show-console-output-window-in-a-forms-application –

+1

@RobertHarvey: Trừ khi tôi bỏ lỡ điều gì đó, bài đăng đó không giải quyết được vấn đề chuyển hướng ... – cedd

+0

Vấn đề chuyển hướng là gì? Bạn đã không nói bất cứ điều gì về điều đó trong câu hỏi của bạn. Ah tôi thấy; bạn tự trả lời. Vâng, trừ khi bạn đang mong đợi câu trả lời bổ sung từ những người khác ... –

Trả lời

15

Về cơ bản có hai điều có thể xảy ra ở đây.

  1. điều khiển đầu ra

Có thể cho một chương trình winforms để đính kèm chính nó vào cửa sổ giao diện điều khiển đã tạo ra nó (hoặc đến một cửa sổ giao diện điều khiển khác nhau, hoặc thực sự đến một cửa sổ giao diện điều khiển mới nếu muốn). Sau khi gắn vào cửa sổ giao diện điều khiển Console.WriteLine() vv hoạt động như mong đợi. Một lưu ý cho cách tiếp cận này là chương trình trả về điều khiển cho cửa sổ giao diện ngay lập tức, và sau đó tiếp tục ghi vào nó, vì vậy người dùng cũng có thể loại bỏ trong cửa sổ giao diện điều khiển. Bạn có thể sử dụng bắt đầu với tham số/wait để xử lý điều này mà tôi nghĩ.

Link to start Command syntax

  1. đổi hướng giao diện điều khiển đầu ra

Đây là khi ống một người nào đó đầu ra từ chương trình của bạn ở một nơi khác, ví dụ như.

yourapp> file.txt

Gắn với một cửa sổ giao diện điều khiển trong trường hợp này một cách hiệu quả bỏ qua các đường ống. Để thực hiện công việc này, bạn có thể gọi Console.OpenStandardOutput() để có được một xử lý cho luồng mà đầu ra nên được đường ống đến. Điều này chỉ hoạt động nếu đầu ra là đường ống, vì vậy nếu bạn muốn xử lý cả hai kịch bản bạn cần để mở đầu ra tiêu chuẩn và ghi vào nó và đính kèm vào cửa sổ giao diện điều khiển. Điều này có nghĩa là đầu ra được gửi đến cửa sổ giao diện điều khiển tới đường ống nhưng đó là giải pháp tốt nhất mà tôi có thể tìm thấy. Bên dưới mã tôi sử dụng để làm điều này.

// This always writes to the parent console window and also to a redirected stdout if there is one. 
// It would be better to do the relevant thing (eg write to the redirected file if there is one, otherwise 
// write to the console) but it doesn't seem possible. 
public class GUIConsoleWriter : IConsoleWriter 
{ 
    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern bool AttachConsole(int dwProcessId); 

    private const int ATTACH_PARENT_PROCESS = -1; 

    StreamWriter _stdOutWriter; 

    // this must be called early in the program 
    public GUIConsoleWriter() 
    { 
     // this needs to happen before attachconsole. 
     // If the output is not redirected we still get a valid stream but it doesn't appear to write anywhere 
     // I guess it probably does write somewhere, but nowhere I can find out about 
     var stdout = Console.OpenStandardOutput(); 
     _stdOutWriter = new StreamWriter(stdout); 
     _stdOutWriter.AutoFlush = true; 

     AttachConsole(ATTACH_PARENT_PROCESS); 
    } 

    public void WriteLine(string line) 
    { 
     _stdOutWriter.WriteLine(line); 
     Console.WriteLine(line); 
    } 
} 
+0

Cảm ơn, đây là một giải pháp tuyệt vời! –

+0

Bạn có thể đọc tùy chọn dòng lệnh để chỉ định có ghi vào đầu ra tiêu chuẩn hay bảng điều khiển – JoelFan

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