Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Самый простой вариант - запустить проект форм Windows, а затем изменить тип вывода на консольное приложение. В качестве альтернативы просто добавьте ссылку на System.Windows.Forms.dll и начните кодирование:

using System.Windows.Forms;

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

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

Ответ 2

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

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

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

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


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

Однако это имеет две разные проблемы:

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

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


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

Ответ 3

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

}

Ответ 4

Это очень просто:

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

для a,

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

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