it-swarm.com.ru

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

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

61
reshefm

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

using System.Windows.Forms;

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

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

87
Marc Gravell

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

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

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

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


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

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

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

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


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

32
Tergiver

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

}
23

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

Просто добавьте следующий атрибут и код в ваш метод 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 :)

6
SharpShade

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

4
David Arno

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

0
Grzenio

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

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

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

0
Sunsetquest

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

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

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

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

Добавьте ссылку на System.Windows.Forms.dll в проекте консольного приложения в обозревателе решений. (Щелкните правой кнопкой мыши на Solution-name-> add-> Reference ...)

Укажите пространство имен в коде: using System.Windows.Forms;

Объявите необходимые свойства в вашем классе для элементов управления, которые вы хотите добавить в форму.

например int Left { get; set; } // need to specify the LEFT position of the button on the Form

А затем добавьте следующий фрагмент кода в Main():

static void Main(string[] args)
{
Application.EnableVisualStyles();
        Form frm = new Form();  // create aForm object

        Button btn = new Button()
        {
            Left = 120,
            Width = 130,
            Height = 30,
            Top = 150,
            Text = "Biju Joseph, Redmond, WA"
        };
       //… more code 
       frm.Controls.Add(btn);  // add button to the Form
       //  …. add more code here as needed

       frm.ShowDialog(); // a modal dialog 
}
0
Biju Joseph

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

для,

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

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

0
Raj kumar