当前位置:  开发笔记 > 编程语言 > 正文

如何从控制台应用程序运行winform?

如何解决《如何从控制台应用程序运行winform?》经验,为你挑选了4个好方法。

如何在控制台应用程序中创建,执行和控制winform?



1> Marc Gravell..:

最简单的选择是启动Windows窗体项目,然后将输出类型更改为控制台应用程序.或者,只需添加对System.Windows.Forms.dll的引用,然后开始编码:

using System.Windows.Forms;

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

重要的一点是[STAThread]您的Main()方法,完全COM支持所需.


@Kenny根据msdn它一直都是

2> Tergiver..:

我最近想这样做,发现我对这里的任何答案都不满意.

如果您遵循Marc的建议并将输出类型设置为Console Application,则存在两个问题:

1)如果您从资源管理器启动应用程序,您的表单后面会出现一个恼人的控制台窗口,在您的程序退出之前该窗口不会消失.我们可以通过在显示GUI(Application.Run)之前调用FreeConsole来缓解此问题.这里的烦恼是控制台窗口仍然出现.它立刻消失了,但是有一会儿就是这样.

2)如果从控制台启动它并显示GUI,控制台将被阻止,直到GUI退出.这是因为控制台(cmd.exe)认为它应该同步启动控制台应用程序和异步启动Windows应用程序(相当于"myprocess&"的unix).


如果将输出类型保留为Windows应用程序,但正确调用AttachConsole,则从控制台调用时不会获得第二个控制台窗口,并且在从Explorer调用时不会获得不必要的控制台.调用AttachConsole的正确方法是将-1传递给它.这会导致我们的进程附加到父进程的控制台(启动我们的控制台窗口).

但是,这有两个不同的问题:

1)由于控制台在后台启动Windows应用程序,它会立即显示提示并允许进一步输入.一方面这是个好消息,控制台没有在您的GUI应用程序上被阻止,但是如果您想要将输出转储到控制台并且从不显示GUI,则程序的输出在提示之后出现并且没有新提示完成后显示.这看起来有点混乱,更不用说你的"控制台应用程序"在后台运行,用户可以在运行时自由执行其他命令.

2)流重定向也搞砸了,例如"myapp some parameters> somefile"无法重定向.流重定向问题需要大量的p/Invoke来修复标准句柄,但它是可以解决的.


经过几个小时的狩猎和实验,我得出的结论是,没有办法完美地完成这项工作.你根本无法获得控制台和窗口的所有好处,没有任何副作用.这是一个挑选哪些副作用最不适合您的应用程序的问题.



3> 小智..:

这是我找到的最好的方法:首先,将项目输出类型设置为"Windows Application",然后将P/Invoke AllocConsole设置为创建控制台窗口.

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();
        }
    }

}


实际上它"不"创建第二个控制台,因为你首先将项目的输出设置为"Windows应用程序",这肯定不是OP所要求的,但很可能是他想要的,因为这样你就没有控制台窗口当你不需要它时
-1,创建第二个控制台窗口并在那里运行命令.不是OP想要的.

4> SharpShade..:

这很简单:

只需将以下属性和代码添加到您的Main方法:

[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
   }
}

现在你完全能够展示WinForms :)

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有