Re[3]: [C#] Спрятать форму из конструктора
От: vdimas Россия  
Дата: 22.11.09 06:01
Оценка: 3 (1)
Здравствуйте, Alexander, Вы писали:

A>2G0ga: Да, согласен, формулировка неправильная. Смысл в том, что надо запустить приложение "спрятанным". Кнопка в панели задач не отображается (для отображения и прятанья окна используется иконка в систрее).


А чем не подходит просто Application.Run()?
Если надо просто физически создать хендл окна, то где-то так:

void main() {
    Control form = new UserControl1();
    form.CreateControl();
    Application.Run();
}


Там есть проблемы создать таким образом хендл окна класса Form, поэтому надо переопределить CreateParams у UserControl, чтобы рамки окна и прочие стили выставить.

Если же надо, чтобы при закрытии главного окна все само выходило, то тут нужен небольшой танец с бубнами. Дело в том, что set_Visible внутри вызывает SetVisibleCore(), который virtual protected. Поэтому где-то так:

    public partial class Form1 : Form
    {
        private bool _myVisible;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void SetVisibleCore(bool value)
        {
            if (value) {
                if (_myVisible)
                    base.SetVisibleCore(true);
                else {
                    MessageBox.Show("I see dead people!");
                    Application.Idle += Application_Idle;
                }
            } else {
                _myVisible = false;
                base.SetVisibleCore(false);
            }
        }

        void Application_Idle(object sender, EventArgs e)
        {
            Application.Idle -= Application_Idle;
            MyVisible = true;
        }

        public bool MyVisible
        {
            get { return Visible; }
            set
            {
                _myVisible = value;
                base.SetVisibleCore(value);
            }
        }
    }


Если же пофиг, создан физически хендл окна или нет, и ты сам в состоянии не забыть где надо вызвать Application.Exit(), то самое правильное так:

        static void Main()
        {
            var frm = new Form();
            frm.Closed += (o, e) => Application.Exit(); 
            frm.Show();  // это можно вызвать и попозже, из трея
            Application.Run();
        }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.