Вопрос

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

Это было полезно?

Решение

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

using System.Windows.Forms;

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

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

Другие советы

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

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

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

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


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

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

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

2) Перенаправление потока также портится, например.«myapp некоторые параметры > какой-то файл» не может перенаправить.Проблема перенаправления потока требует значительного количества 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:

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

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

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

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

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

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

для

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

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

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

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

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

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

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

Укажите пространство имен в коде: 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 
}
scroll top