Приложение C #. Запуск без формы - PullRequest
10 голосов
/ 18 января 2011

Можно ли вызвать Application.Run, но не передать параметр формы, или есть альтернатива, если формы для вызова нет?

Кажется, что у метода Run нет перегрузок, которые не принимают форму.

Например, если я хотел сначала создать экземпляр класса, а затем вызвать этот вызов формы, есть ли способ сделать эквивалент:

Application.Run(myClass);

Просто чтобы уточнить, я все еще хочу функциональность, которую обеспечивает .Run (). То есть создайте цикл, чтобы приложение продолжало работать, но вместо отслеживания формы отслеживайте класс или другой объект.

Это изначально относится к компактной структуре. Я предполагаю, что именно поэтому у метода Run нет той перегрузки, которую я искал.

Ответы [ 4 ]

14 голосов
/ 18 января 2011

Кажется, что у метода Run нет перегрузок, которые не принимают форму.

Э-э ... http://msdn.microsoft.com/en-us/library/ms157900.aspx

Application.Run Метод

Начинает запуск стандартного цикла сообщений приложения в текущем потоке без формы.

public static void Run()

7 голосов
/ 18 января 2011

Мне не ясно, хотите ли вы сделать:

  1. Вы хотите загрузить свою форму где-то, кроме Main ()
  2. Или запустить консоль или приложение-службус нет UI.

Для (1) :

static void main()
{
    //Your program starts running here<<<

    //Do some stuff...
    FormRunner a = new FormRunner();
    a.RunForm();

} // << And ends here

class FormRunner {

    public void RunForm() {
        Application.Run(new Form());
    }

    //You could call which ever form you want from here?
} // << And ends here

Что нужно знатьВаша программа начинается с первой строки основной и заканчивается последней. Однако , когда вы звоните Application.Run(FORM), он загружает цикл сообщений Windows для этой формы.Это специальный цикл, который сохраняет программу в основном состоянии и ожидает событий (они называются сообщениями Windows в Win32 API)

И поэтому программа не завершается, пока пользователь не нажмет кнопку закрытия.Когда это происходит, то тогда ваша программа на самом деле будет return из своего основного.

(2) Так что теперь, если вам нужно просто консольное приложение без форм:

static void main()
{
    AcceptInputs()
    DrawScreen()

    //Do something else.
    //Make sure your flow stays within the main

} // << Once you come here you're done.

void AcceptInputs()
{
    while(true) {

        //Keep accepting input
        break; // Call break when you're done. You'll be back in the main
    }
}

Надеюсь, это помогло.

3 голосов
/ 18 января 2011

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

2 голосов
/ 22 февраля 2017
using System;
using System.Windows.Forms;

static class Program
   [STAThread]
   static void Main() {
      Application.Run(new myClass());
   }

   internal class myClass : ApplicationContext {
      public myClass() {
         Application.Run(new myWindow());
      }
   }
}

Проблема, однако, в том, что что-то должно будет вызвать этот экземпляр myClass и сказать ему выйти, иначе программа просто продолжит работать даже после закрытия всех форм. И вызов ExitThread () в конструкторе игнорируется.

...