dave_bulac Ответов: 3

Как использовать сериализацию для события " checkedchanged"


Привет, ребята, мне нужна небольшая помощь. Итак, я сделал приложение в Windows Forms, оно отлично работает, и теперь я хочу запускать это приложение каждый раз, когда запускается Windows. Я успешно сделал это с помощью этого кода:
RegistryKey add = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
add.SetValue("Battery", "\"" + Application.ExecutablePath.ToString() + "\"");


Но я отредактировал один флажок в форме. Если он установлен, он должен запускаться при загрузке Windows.Если он не установлен, то он не должен запускаться вместе с Windows. Поэтому я сделал событие CheckedChanged, которое определяет, когда флажок изменен, но я не знаю, как сохранить значение флажка, чтобы после завершения работы он не был удален.

Что я уже пробовал:

Я нашел в интернете, что могу сделать это с помощью "Сериализуемого". Я только понял, что я должен написать его перед классом и чем сохранить информацию в "XML, Binarystream, Memory Stream". Но я не знаю, что мне спасать и как ? Кто-нибудь может мне помочь ?

BillWoodruff

Нужно ли здесь рассматривать вопросы безопасности ? В зависимости от контекста и конфигурации Win запись в реестр может быть ограничена.

Другой, более простой метод заключается в том, чтобы поместить ярлык (файл.lnk) для вашего приложения в папку запуска Windows. Спросите, если хотите увидеть пример этого.

3 Ответов

Рейтинг:
2

Thomas Nielsen - getCore

Предположим, если вы пытаетесь открыть ключ, который вы добавляете при загрузке вашей программы, если он там есть, значит, вы должны начать проверку, если пользователь снимает галочку, удалите ключ. Если пользователь затем проверяет его снова, попробуйте открыть ключ, если его там нет, создайте.


Рейтинг:
17

BillWoodruff

Другой способ добиться этого-создать настройку приложения [^] типа Bool. В этом примере FormClosing EventHandler сравнивает состояние флажка с параметром, а затем добавляет или удаляет раздел реестра, если это необходимо.

Установить параметр 'область 'bool в настройках пользователя, а не Приложения.

using System;
using System.Windows.Forms;

namespace AutoOpen
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private bool isAutoStartNow, isChecked;

        private void Form1_Load(object sender, EventArgs e)
        {
            isAutoStartNow = (bool)Properties.Settings.Default["AutoStart"];

            checkBox1.Checked = isAutoStartNow;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            isChecked = checkBox1.Checked;

            isAutoStartNow = (bool)Properties.Settings.Default["AutoStart"];

            // no change necessary
            if (isAutoStartNow == isChecked) return;

            Properties.Settings.Default["AutoStart"] = isChecked;

            if (isChecked)
            {
                // set the registry key
            }
            else
            {
                // delete thr registry key
            }

           // save setting
            Properties.Settings.Default.Save();
        }
    }
}


dave_bulac

Большое спасибо.

dave_bulac

Но там, где я отредактировал настройки, есть один столбец с именем Value, и теперь он установлен в false для моего bool. Что это значит ?

BillWoodruff

При создании параметра для него будет установлено значение по умолчанию для данного типа параметра. Для Bool это значение равно ' false. Но вы можете отредактировать это значение, изменить его на "true", если хотите, в конструкторе настроек.

Рейтинг:
1

Graeme_Grant

Этот Поиск В Google: c# запуск приложения при запуске windows[^] подвернулось вот это: c# - Как настроить запуск программы при запуске-переполнение стека[^]:

using Microsoft.Win32;

private void SetStartup()
{
	RegistryKey rk = Registry.CurrentUser.OpenSubKey
		("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

	if (chkStartUp.Checked)
		rk.SetValue(AppName, Application.ExecutablePath.ToString());
	else
		rk.DeleteValue(AppName,false);            

}