2014-01-16 152 views

回答

-1

它不直接支持沒有。

你可以做的是有兩個獨立的應用程序,一個窗體和一個控制檯。從表單1啓動控制檯,並在應用程序之間傳遞數據。如果你想設置的形式是「內部」的控制檯應用程序,你可以使用

http://msdn.microsoft.com/en-us/library/aa984420%28v=vs.71%29.aspx

+0

什麼你的意思是「不直接支持」?添加對'System.Windows.Forms'的引用,然後在你的控制檯應用程序中寫入:'System.Windows.Forms.Form f = new System.Windows.Forms.Form(); f.ShowDialog();' – Spook

+0

問題是措辭「我如何使用控制檯應用程序創建Windows窗體?」你不能直接這樣做。而且你也不能把它們作爲一個窗口連接在一起,但是你可以(正如我指出的那樣)製造幻覺。 編輯:我不應該說你不能,一個可能,但我不知道任何傳統的手段。 – Emz

+0

實例化窗體並調用ShowDialog可以更常規嗎?你甚至可以很簡單地添加一個Windows窗體到控制檯項目並在VS設計器中進行編輯。我沒有看到這裏的「不直接支持」。 「不常見」,也許。順便說一句,相反需要〜1行代碼(向WF應用程序添加控制檯支持) – Spook

0

首先,你要明白,在Windows窗口的工作方式。每個窗口化的程序管理一個稱爲消息隊列的東西。消息是來自系統(和其他應用程序)的信息,表示發生了某些事情,例如某人按下了某個鍵或移動了一個鼠標,這樣窗口就可以正確地響應該用戶的操作。

處理消息(包括將它們分發到適當的窗口)是程序的責任,並且在Windows窗體應用程序中通過一些內部消息處理循環在Application.Run方法(或附近的某個地方)中完成。但是如果你想在你的控制檯應用程序中顯示一個窗口,有人必須爲這個過程負責,否則窗口將無法正常工作(實際上,它們根本無法工作)。

如果您有模式顯示一個窗口,它將處理郵件來它本身,這樣你就可以直接從myWindow.ShowDialog代碼中調用,並且將工作 - 但直到窗口關閉將鎖定控制檯輸入了。這意味着,您將能夠通過Console.WriteLine將文本發送到控制檯,但您將無法 - 例如 - 通過Console.ReadLine向用戶詢問文字,直到窗口關閉。

class Program 
{ 
    public static void Main(string[] args) 
    { 
     System.Windows.Forms.Form f = new System.Windows.Forms.Form(); 
     f.Click += (o, e) => { Console.WriteLine("Clicked!"); }; 
     f.ShowDialog(); 
     Console.ReadLine(); 
    } 
} 

// (run, then click on a form to observe result) 

另一方面,如果您想以非對話方式顯示窗口,事情會變得複雜。我想到的最簡單的事情是創建Windows窗體應用程序,並使用AllocConsole爲應用程序創建單獨的控制檯窗口(例如,Blender會這樣做)。另一種選擇是創建兩個不同的應用程序 - 控制檯和Windows窗體,從第一個開始運行並通過某種機制(命名管道,共享全局內存,Windows消息,TCP/IP等)管理它們的通信。

相關問題