2008-11-10 32 views

Trả lời

76

Tùy chọn dễ nhất là bắt đầu dự án biểu mẫu cửa sổ, sau đó thay đổi loại đầu ra thành Ứng dụng Console. Ngoài ra, chỉ cần thêm một tham chiếu đến System.Windows.Forms.dll, và bắt đầu viết mã:

using System.Windows.Forms; 

[STAThread] 
static void Main() { 
    Application.EnableVisualStyles(); 
    Application.Run(new Form()); // or whatever 
} 

Các bit quan trọng là [STAThread] trên phương pháp Main() của bạn, yêu cầu hỗ trợ COM đầy đủ.

+4

Các STAThread đã thực sự là điều khiến sự khác biệt ... – reshefm

+0

'STAThreadAttribute' là trong Không gian tên 'System' trong .NET 4. –

+6

@Kenny theo msdn nó luôn là –

4

Bạn có thể tạo dự án winform trong VS2005/VS2008 và sau đó thay đổi thuộc tính của nó thành ứng dụng dòng lệnh. Sau đó nó có thể được bắt đầu từ dòng lệnh, nhưng vẫn sẽ mở một biểu tượng chiến thắng.

0

Bạn sẽ có thể sử dụng lớp Ứng dụng giống như cách ứng dụng Winform thực hiện. Có lẽ cách dễ nhất để bắt đầu dự án mới là thực hiện những gì Marc đề xuất: tạo dự án Winform mới, sau đó thay đổi tùy chọn trong ứng dụng giao diện điều khiển

19

Đây là phương pháp tốt nhất mà tôi đã tìm thấy: Đầu tiên , thiết lập kiểu đầu ra của dự án của bạn thành "Ứng dụng Windows", sau đó P/Gọi AllocConsole để tạo cửa sổ bảng điều khiển.

internal static class NativeMethods 
{ 
    [DllImport("kernel32.dll")] 
    internal static extern Boolean AllocConsole(); 
} 

static class Program 
{ 

    static void Main(string[] args) { 
     if (args.Length == 0) { 
      // run as windows app 
      Application.EnableVisualStyles(); 
      Application.Run(new Form1()); 
     } else { 
      // run as console app 
      NativeMethods.AllocConsole(); 
      Console.WriteLine("Hello World"); 
      Console.ReadLine(); 
     } 
    } 

} 
+2

-1, tạo cửa sổ bảng điều khiển thứ hai và chạy lệnh đó. Không phải những gì OP muốn. – tomfanning

+7

thực sự nó không 'tạo' một giao diện thứ hai, bởi vì bạn đặt đầu ra của dự án thành' Windows Application' đầu tiên, được thừa nhận không phải những gì OP yêu cầu, nhưng nhiều khả năng những gì anh ta muốn, bởi vì theo cách đó bạn không có giao diện điều khiển cửa sổ khi bạn không cần nó – DrCopyPaste

+0

hoạt động như quảng cáo, mặc dù tôi không nhận được biểu tượng ứng dụng và tôi không nghĩ rằng "thư mục làm việc hiện tại" là như nhau - bất kỳ ý tưởng? – drzaus

6

Nó rất rất đơn giản để làm:

Chỉ cần thêm thuộc tính và mã sau vào Main-phương pháp của bạn:

[STAThread] 
void Main(string[] args]) 
{ 
    Application.EnableVisualStyles(); 
    //Do some stuff... 
    while(!Exit) 
    { 
     Application.DoEvents(); //Now if you call "form.Show()" your form won´t be frozen 
     //Do your stuff 
    } 
} 

Bây giờ you're hoàn toàn có khả năng hiển thị WinForms :)

+1

Hoạt động tốt! Nếu bạn cần kiểm tra tổ hợp phím, bạn sẽ phải kiểm tra tính khả dụng của khóa bằng cách sử dụng Console.KeyAvailable trước khi gọi Console.ReadKey, nếu không bạn sẽ chặn vòng lặp sự kiện (và do đó biểu mẫu của bạn) – wexman

+0

Cảm ơn bạn đã thêm @wexman I quên mất điều đó. – SharpShade

26

Gần đây tôi muốn làm điều này và thấy rằng tôi không hài lòng với bất kỳ câu trả lời nào ở đây.

Nếu bạn làm theo lời khuyên của Marc và thiết lập đầu ra kiểu để Console Application có hai vấn đề:

1) Nếu bạn khởi động ứng dụng từ Explorer, bạn nhận được một giao diện điều khiển cửa sổ gây phiền nhiễu đằng sau Form của bạn mà không làm đi cho đến khi chương trình của bạn thoát. Chúng ta có thể giảm thiểu vấn đề này bằng cách gọi FreeConsole trước khi hiển thị GUI (Application.Run). Sự khó chịu ở đây là cửa sổ giao diện điều khiển vẫn xuất hiện. Nó ngay lập tức biến mất, nhưng có một khoảnh khắc không chút nào.

2) Nếu bạn khởi chạy từ bảng điều khiển và hiển thị GUI, bảng điều khiển sẽ bị chặn cho đến khi GUI thoát. Điều này là do giao diện điều khiển (cmd.exe) nghĩ rằng nó nên khởi chạy ứng dụng Console đồng bộ và các ứng dụng Windows không đồng bộ (tương đương unix của "myprocess &").


Nếu bạn rời khỏi đầu ra kiểu như Windows Application, nhưng đúng gọi AttachConsole, bạn không nhận được một cửa sổ giao diện điều khiển thứ hai khi gọi từ một giao diện điều khiển và bạn không nhận được giao diện điều khiển không cần thiết khi được gọi từ Explorer. Cách chính xác để gọi AttachConsole là chuyển -1 cho nó. Điều này gây ra quá trình của chúng tôi để đính kèm vào giao diện điều khiển của quá trình cha mẹ của chúng tôi (cửa sổ giao diện điều khiển đưa ra chúng tôi).

Tuy nhiên, đây có hai vấn đề khác nhau:

1) Bởi vì giao diện điều khiển khởi động các ứng dụng Windows ở chế độ nền, nó ngay lập tức sẽ hiển thị dấu nhắc và cho phép đầu vào tiếp tục.Một mặt, đây là tin tốt, giao diện điều khiển không bị chặn trên ứng dụng GUI của bạn, nhưng trong trường hợp bạn muốn đổ kết xuất ra bàn điều khiển và không bao giờ hiển thị GUI, đầu ra của chương trình sẽ xuất hiện sau dấu nhắc và không có dấu nhắc mới hiển thị khi bạn hoàn tất. Điều này có vẻ hơi khó hiểu, chưa kể rằng "ứng dụng giao diện điều khiển" của bạn đang chạy trong nền và người dùng được tự do thực thi các lệnh khác trong khi nó đang chạy.

2) Chuyển hướng luồng cũng bị làm sai lệch, ví dụ: "myapp một số tham số> somefile" không chuyển hướng được. Vấn đề chuyển hướng luồng yêu cầu số lượng đáng kể p/Gọi để sửa chữa các tay cầm chuẩn, nhưng nó có thể giải quyết được.


Sau nhiều giờ săn bắn và thử nghiệm, tôi đã đi đến kết luận rằng không có cách nào để làm điều này một cách hoàn hảo. Bạn chỉ đơn giản là không thể có được tất cả những lợi ích của cả hai giao diện điều khiển và cửa sổ mà không có bất kỳ tác dụng phụ. Đó là vấn đề chọn tác dụng phụ nào ít gây phiền toái nhất cho mục đích của ứng dụng của bạn.

+0

Tôi cũng thêm rằng để có được đầu ra đầu cuối trong đơn GNU/Linux, một ứng dụng cửa sổ thông thường là đủ. I E. 'Console.WriteLine' luôn hoạt động theo mặc định. –

0

này đã làm việc cho các nhu cầu của tôi ...

Task mytask = Task.Run(() => 
{ 
    MyForm form = new MyForm(); 
    form.ShowDialog(); 
}); 

này bắt đầu từ trong một chủ đề mới và không phát hành các chủ đề cho đến khi mẫu được đóng lại. Task nằm trong .Net 4 trở lên.

0

Hoàn toàn tùy thuộc vào lựa chọn của bạn, rằng cách bạn đang triển khai.
a. Quy trình đính kèm, ví dụ: đầu vào trên biểu mẫu và in trên bảng điều khiển
b. Quy trình độc lập, ví dụ: bắt đầu hẹn giờ, không đóng ngay cả khi thoát khỏi giao diện điều khiển.

cho một

Application.Run(new Form1()); 
//or ------------- 
Form1 f = new Form1(); 
f.ShowDialog(); 

cho b, Sử dụng chủ đề, hoặc có thể thao tác bất cứ điều gì, How to open win form independently?

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