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


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

10 57

10 ответов:

самый простой вариант-запустить проект windows forms, а затем изменить тип вывода на консольное приложение. Кроме того, просто добавьте ссылку на систему.Окна.Формы.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. Это потому, что консоль (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();
        }
    }

}

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

просто добавьте следующий атрибут и код в свой основной метод:

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

теперь вы в полной мере смогли проявить обязанности и достижения :)

вы можете создать проект 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, в консольном приложении:

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