Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Запуск приложения свёрнутым


Автор: CasperSC 21.1.2010, 09:16
Здравствуйте, подскажите пожалуйста кто нибудь как сделать, чтобы приложение запускалось из автозагрузки свёрнутым, а при ручном запуске не свёрнутым. незнаю, но мож кого интересует как я вообще реализовал авторзапуск:
Код

public void AutoRunCreateOrDelete()
        {
            if (Properties.Settings.Default.AutoRun)
            {
                Microsoft.Win32.RegistryKey myKey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run\", true);
                myKey.SetValue("MyProgram.NET", Application.ExecutablePath);
                Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run\", true);
                myKey.Close();
                Registry.CurrentUser.Close();
            }
            else
            {
                Microsoft.Win32.RegistryKey myKey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run\", true);
                myKey.SetValue("MyProgram.NET", Application.ExecutablePath);
                myKey.DeleteValue("MyProgram.NET");
                myKey.Close();
                Registry.CurrentUser.Close();
            }
        }


Читал про передачу аргументов методу Main, но что-то я не понимаю как это организовать через реестр, ну всмысле я про аргументы, в смысле не знаю как их передать через реестр и записать в ключ реестра. И ещё есть вариант, узнать сколько времени работает система, но мне кажется это самы худший. так как не у всех за минуту компьютер грузиться, да и можно запустить самому программу, после включения компьютера и пользователь будет недоумевать, почему программа, то запускается свёрнутой, то нормально.

Автор: explorer 21.1.2010, 11:35
Заведи ключ (параметр командной строки), присутствие которого будет означать, что нужно запустить программу сразу свернутой. Ключ передать как параметр строки просто:
Код

if (Properties.Settings.Default.AutoRun)
            {
                Microsoft.Win32.RegistryKey myKey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run\", true);
                myKey.SetValue("MyProgram.NET", Application.ExecutablePath + " -hide");
                Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run\", true);
                myKey.Close();
                Registry.CurrentUser.Close();
            }
            else
            {
                Microsoft.Win32.RegistryKey myKey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run\", true);
                myKey.SetValue("MyProgram.NET", Application.ExecutablePath + " -hide");
                myKey.DeleteValue("MyProgram.NET");
                myKey.Close();
                Registry.CurrentUser.Close();
            }

Ну а дальше, в самой программе проверяй наичие ключа, и решай, что делать дальше (в каком виде запускать программу).

Автор: CasperSC 21.1.2010, 12:05
Код

namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main(string[] arguments)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            if (arguments.Length != 0)
            {
                if (arguments[0] == "-hide")
                {
                    MainForm.formMain.hideForm = true; ;
                }
            }
            Application.Run(new MainForm());
        }
    }
}




 
Код

public partial class MainForm : Form
    {
        ...
       public static MainForm formMain;   //объявляю переменную
        ...
        public MainForm()
        {
            InitializeComponent();
          formMain = this;     //здесь ссылаюсь на главную форму
            Set_MouseDown_Hook(this);
        }


Код

private void MainForm_Shown(object sender, EventArgs e)
        {
            if (hideForm == true)
            {
                this.Visible = false;
            }
        }


Ну проверял с помощью MessageBox.Show("Работает");
И работает, только когда вместо MessageBox стоит this.Visible = false; форма просто не грузиться, а точнее грузиться и сразу завершается, увидел это с помощью Process Explorer'a (замена диспетчеру задач)

Автор: KelTron 21.1.2010, 14:46
Если я правильно понял задачу:
Код

static void Main(string[] arguments)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    bool isMinimizeOnLoad = false;
    if (arguments.Length != 0)
    {
        if (arguments[0] == "-hide")
        {
            isMinimizeOnLoad = true;
        }
    }
    Application.Run(new MainForm(isMinimizeOnLoad));
}


Код

public partial class MainForm : Form
{
    private bool isMinimizeOnLoad;

    public MainForm(bool isMinimizeOnLoad)
    {
        InitializeComponent();
        this.isMinimizeOnLoad = isMinimizeOnLoad;
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
        if (this.isMinimizeOnLoad)
        {
            this.WindowState = FormWindowState.Minimized;
        }
    }
}



Автор: CasperSC 21.1.2010, 17:23
Цитата(KelTron @  21.1.2010,  14:46 Найти цитируемый пост)
Если я правильно понял задачу:


К сожалению нет. Во первых не свёрнута форма должна быть, а скрыта, просто иконка в трее напоминать о программе. Одно название переменной в двух разных методах немного запутывает (isMinimizeOnLoad). Мне вообще просто надо было бы реализовать получение атрибута (вроде уже реализовал) и скрытие формы если какая либо переменная связанная с атрибутом равна true. Попробую этот способ, только с скрытием формы, напишу рабочий результат, если такой будет.

-------------------------------------------------

Короче я попробовал, оказывается всё работает, мой способ почти ничем не отличается, только названием переменных и при событии главной формы Shown скрывается форма:
Код
if (this.hideForm)
            {
                this.Hide();
            }


Автор: KelTron 21.1.2010, 18:30
Ну всё то же самое, только добавь на форму NotifyIcon и при загрузке пихай программу в трей...

Цитата(CasperSC @  21.1.2010,  17:23 Найти цитируемый пост)
Одно название переменной в двух разных методах немного запутывает

Если переменная используется для одной и той же цели, почему бы не назвать её одинаково ..)

Добавлено через 2 минуты и 54 секунды
Чтоб скрыть форму из панели задач нужно добавить 1 строчку:
Код

if (this.isMinimizeOnLoad)
        {
            this.WindowState = FormWindowState.Minimized;
            this.ShowInTaskbar = false;
        }

Автор: CasperSC 21.1.2010, 19:46
Цитата(KelTron @ 21.1.2010,  18:30)
Добавлено @ 18:33
Чтоб скрыть форму из панели задач нужно добавить 1 строчку:
Код

if (this.isMinimizeOnLoad)
        {
            this.WindowState = FormWindowState.Minimized;
            this.ShowInTaskbar = false;
        }

Нет такой способ мне кажется слишком замудрённым, не из-за его якобы сложности, а из-за того, что проще сделать this.Hide(); и всё. Если использовать выше приведённый способ, то у меня автоматом в приложении появляются несостыковки. так как например при событии главной формы VisibleChanged происходит:

Код

 private void MainForm_VisibleChanged(object sender, EventArgs e)
        {
            if (this.Visible)
            {
                this.trayMenuStrip.Items[this.trayMenuStrip.Items.IndexOf(показатьToolStripMenuItem)].Text = "Скрыть";
            }
            else
            {
                this.trayMenuStrip.Items[this.trayMenuStrip.Items.IndexOf(показатьToolStripMenuItem)].Text = "Показать";
            }
        }



И соответсвенно реакция на видимость формы у того же контекстного меню:
Код

private void показатьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (this.Visible)
            {
                if (Properties.Settings.Default.UseAnimationHide)
                {
                    this.AnimatedHide();
                }
                else
                {
                    this.Hide();
                }  
            }
            else
            {
                if (Properties.Settings.Default.UseAnimationHide)
                {
                    this.AnimatedShow();
                }
                else
                {
                    //так как используется смена положения Y 
                    //в анимированном скрытии, то при выключении этой возможности
                    //форма могла остаться за экраном
                    this.Location = pointLocation;
                    this.Show();
                }  
            }
        }

Автор: KelTron 21.1.2010, 20:23
Цитата(CasperSC @  21.1.2010,  19:46 Найти цитируемый пост)
проще сделать this.Hide();

Ну, кстати, да так лучше. Совсем забыл, что есть такой метод ..)





Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)