как запустить winform из консольного приложения?

Как создать, выполнить и управлять winform из консольного приложения?

10 ответов


самый простой вариант-запустить проект windows forms, а затем изменить тип вывода на консольное приложение. В качестве альтернативы просто добавьте ссылку на System.Окна.Формы.dll, и начать кодирование:

using System.Windows.Forms;

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

важный момент-это [STAThread] на Main() метод, необходимый для полной поддержки COM.


недавно я хотел сделать это и обнаружил, что я не был доволен ни одним из ответов здесь.

Если вы последуете совету Марка и установите тип вывода в консольное приложение, возникнут две проблемы:

1) Если вы запустите приложение из проводника, вы получите раздражающее окно консоли за вашей формой, которое не исчезнет, пока ваша программа не выйдет. Мы можем смягчить эту проблему, вызвав FreeConsole до показа GUI (приложения.Работать.) Раздражение здесь что окно консоли не появляется. Оно тотчас же исчезает, но остается на мгновение.

2) Если вы запускаете его с консоли и отображаете GUI, консоль блокируется до выхода GUI. Это потому, что консоль (cmd.exe) считает, что он должен запускать консольные приложения синхронно и приложения Windows асинхронно (Unix-эквивалент "myprocess &").


Если вы оставите тип вывода Как приложение Windows, но правильно вызовите AttachConsole, вы не получите второе окно консоли при вызове из консоли, и вы не получите ненужную консоль при вызове из Проводника. Правильный способ вызова AttachConsole-передать ему -1. Это заставляет наш процесс присоединяться к консоли нашего родительского процесса (окно консоли, которое запустило нас).

однако у этого есть две разные проблемы:

1) поскольку консоль запускает приложения Windows в фоновом режиме, она немедленно отображает приглашение и позволяет дальнейший ввод. С одной стороны, это хорошая новость, консоль не блокируется в вашем приложении GUI, но в случае, когда вы хотите сбросить вывод на консоль и никогда не показывать GUI, вывод вашей программы происходит после приглашения, и новое приглашение не отображается, когда вы закончите. Это выглядит немного запутанным, не говоря уже о том, что ваше "консольное приложение" работает в фоновом режиме, и пользователь может выполнять другие команды во время его работы.

2) Перенаправление потока также запутывается, например, "myapp some parameters > somefile" не удается перенаправить. Проблема перенаправления потока требует значительного количества P / Invoke для исправления стандартных дескрипторов, но она разрешима.


После многих часов охоты и экспериментов я пришел к выводу, что нет способа сделать это идеально. Вы просто не можете получить все преимущества консоли и окна без каких-либо побочных эффектов. Это вопрос выбора. какие побочные эффекты наименее раздражают для целей вашего приложения.


вот лучший метод, который я нашел: Сначала установите тип вывода проектов в "приложение Windows", затем 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();
        }
    }

}

его очень просто сделать:

просто добавьте следующий атрибут и код в свой Main-method:

[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:)


вы можете создать проект winform в VS2005 / VS2008, а затем изменить его свойства, чтобы быть приложением командной строки. Затем его можно запустить из командной строки, но все равно откроется winform.


вы должны иметь возможность использовать класс приложения так же, как это делают приложения Winform. Вероятно, самый простой способ начать новый проект-сделать то, что предложил Марк: создать новый проект Winform, а затем изменить его в параметрах на консольное приложение


это сработало для моих нужд...

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

откроется в новом потоке и не отпускать нить, пока форма не будет закрыта. Task в .Net 4 и позже.


его полностью зависит от вашего выбора, как вы реализуете.
a. Прилагаемый процесс, например: ввод в форму и печать на консоли
b. Независимый процесс, например: запустите таймер, не закрывайте, даже если выход из консоли.

на

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

для b, Используйте поток или что-нибудь, как открыть форму выигрыша самостоятельно?


Если вы хотите сбежать от Заморозить Форма и используйте редактирование (например, текст для кнопки) используйте этот код

Form form = new Form();
Form.Button.Text = "randomText";
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.Run(form);

все вышеперечисленные ответы очень помогают, но я подумал добавить еще несколько советов для абсолютного новичка.

Итак, вы хотите что-то сделать с Windows Forms, в консольном приложении:

добавить ссылку