2014-01-16 150 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等)管理它们的通信。

相关问题