Как создать, выполнить и управлять winform из консольного приложения?
Как запустить winform из консольного приложения?
Ответ 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, Используйте нить или задайте что-нибудь, Как открыть форму выигрыша самостоятельно?