728x90
반응형
1. 레지스트리 영역에 값을 저장 (관리자 권한이 아닐때는 실행이 안될수도 있다)
1.1 저장될 경로 찾아보기
- 실행 - regedit
- HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER => SOFTWARE => WOW6432Node (다른 영역은 건드리지 말자....삭제도 조심히 하세요 ㅠㅠ 새로만든 레지스트리 삭제하려다가 폴더하나 날려서 백업도 안해서 윈도우 복원했네요...)
1.2 winform 코딩
- form 추가 (class가 이미 정의되어 있다. 참조 추가할 필요도 없다!)
- namespace 추가 using Microsoft.Win32;
- 코드 작성
// 레지스트리 생성
RegistryKey reg = Registry.LocalMachine.OpenSubKey("SOFTWARE", true); // true를 안 주면 읽기전용으로 만들어짐!
reg.CreateSubKey("RegistryApp");
reg.Close();
// 레지스트리 안에 Key : Value 형태로 값저장
RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\RegistryApp", true);
reg.SetValue("name", "ABC123홍길동");
reg.SetValue("version", 0.1);
reg.Close();
// key값으로 value 값 가져오기 및 값 재설정
// 업데이트 버전체크도 이런 식으로 할 수 있다
RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\RegistryApp", true);
float ver = Convert.ToSingle(reg.GetValue("version", 0.1));
if (ver < 4.5)
{
//서버에서 파일 다운로드하고 업데이트 한다.(가정)
//업데이트 성공시 현재 버전을 다시 저장한다.
reg.SetValue("version", 4.5);
}
reg.Close();
// 레지스트리 삭제
RegistryKey reg = Registry.LocalMachine.OpenSubKey("SOFTWARE\WOW6432Node\RegistryApp", true);
reg.DeleteSubKey("RegistryApp");
reg.Close();
1.3 로그인 화면으로 응용
- 읽고 쓰기용 메소드 만들기
static string key = "SOFTWARE\WOW6432Node\RegistryApp"; public bool WriteRegKey(string valueName, object value) { try { Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, value); Registry.CurrentUser.Close(); return true; } catch { return false; } } public object ReadRegKey(string valueName, object defaultValue) { try { //서브키를 오픈한 후 데이터를 조회한다. object readVal = Registry.CurrentUser.CreateSubKey(key).GetValue(valueName); if (readVal == null) { //서브키나 데이터가 없는 경우(최초1번)에는 기본값으로 저장한다. Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, defaultValue); readVal = defaultValue; } //서브키를 닫는다. Registry.CurrentUser.Close(); return readVal; } catch { return defaultValue; } }
- 제일 처음 실행할때는 레지스트리에 저장된 값이 없다 => 저장된 값이 없는 경우에도 오류가 나지 않도록 기본설정값을 셋팅해야한다.
- Form_load : 레지스트리에 저장된 폼의 크기, 폼의 위치 값을 읽어와서 폼에 적용.
private void Form1_Load(object sender, EventArgs e) { this.Left = Convert.ToInt32(RegistryHelp.ReadRegKey("Left", 0)); this.Top = Convert.ToInt32(RegistryHelp.ReadRegKey("Top", 0)); this.Width = Convert.ToInt32(RegistryHelp.ReadRegKey("Width", this.Width)); this.Height = Convert.ToInt32(RegistryHelp.ReadRegKey("Height", this.Height)); textBox1.Text = RegistryHelp.ReadRegKey("userID", "").ToString(); checkBox1.Checked = Convert.ToBoolean(RegistryHelp.ReadRegKey("userIDSaveCheck", 0)); }
- Form_closing : 레지스트리에 현재 폼의 크기, 폼의 위치 값을 저장해놓고, 폼이 닫힌다.
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { RegistryHelp.WriteRegKey("Left", this.Left); RegistryHelp.WriteRegKey("Top", this.Top); RegistryHelp.WriteRegKey("Width", this.Width); RegistryHelp.WriteRegKey("Height", this.Height); }
- Form_load : 레지스트리에 저장된 폼의 크기, 폼의 위치 값을 읽어와서 폼에 적용.
- 로그인ID 저장 버튼을 체크하고 "로그인" 버튼을 눌렀을 때
private void button1_Click(object sender, EventArgs e) { //유효성검사 //DB에서 로그인 체크 //로그인이 성공했다면 //사용자정보를 LoginUser 프로퍼티에 저장 //체크가 되었을때, 레지스트리에 사용자아이디값을 저장 if (textBox1.Text == "root" && textBox2.Text == "1234") { if (checkBox1.Checked) { RegistryHelp.WriteRegKey("userID", textBox1.Text); RegistryHelp.WriteRegKey("userIDSaveCheck", 1); } else { RegistryHelp.WriteRegKey("userID", textBox1.Text); RegistryHelp.WriteRegKey("userIDSaveCheck", 0); } MessageBox.Show("로그인성공"); this.Close(); } }
2. .ini 파일 (파일이므로 탐색기에서 일반사용자에게 노출)
- 탐색기에 *.ini 를 검색하면 확인해볼 수 있기 때문에 보안에 취약하다.
public bool WriteRegKey(string valueName, object value)
{
try
{
Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, value);
Registry.CurrentUser.Close();
return true;
}
catch
{
return false;
}
}
public object ReadRegKey(string valueName, object defaultValue)
{
try
{
//서브키를 오픈한 후 데이터를 조회한다.
object readVal = Registry.CurrentUser.CreateSubKey(key).GetValue(valueName);
if (readVal == null)
{
//서브키나 데이터가 없는 경우(최초1번)에는 기본값으로 저장한다.
Registry.CurrentUser.CreateSubKey(key).SetValue(valueName, defaultValue);
readVal = defaultValue;
}
//서브키를 닫는다.
Registry.CurrentUser.Close();
return readVal;
}
catch
{
return defaultValue;
}
}
//로그인 버튼 클릭시
private void button1_Click(object sender, EventArgs e)
{
// 유효성검사
//DB에서 로그인 체크
//로그인이 성공했다면
//사용자정보를 LoginUser 프로퍼티에 저장
//체크가 되었을때, 레지스트리에 사용자아이디값을 저장
if (textBox1.Text == "root" && textBox2.Text == "1234")
{
//로그인id 저장하기를 체크했을때
if (checkBox1.Checked)
{
IniFileHelp ini = new IniFileHelp("C:\\Registry.ini");
ini.WriteIniFile("Info", "Uid", textBox1.Text);
ini.WriteIniFile("Info", "CheckYN", checkBox1.Checked ? "1":"0"); //string 형식으로 변수를 주어야한다
}
MessageBox.Show("저장성공");
}
}
private void Form3_Load(object sender, EventArgs e)
{
//파일이 있는경우에만 실행하기
if (System.IO.File.Exists("C:\\Registry.ini"))
{
IniFileHelp ini = new IniFileHelp("C:\\Registry.ini");
textBox1.Text = ini.ReadIniFile("Info", "Uid", "");
if (ini.ReadIniFile("Info", "CheckYN", "0") == "1")
checkBox1.Checked = true;
else
checkBox1.Checked = false;
}
}
3. Confiig 파일 => App.config / Settings
3.1 app.config => 컴퓨터의 모든 사용자에게 공통적으로 사용되는값
프로젝트의 Properties 아래에 Setting,settings를 들어가면 이름, 형식, 범위 ,값을 입력할 수 있다. 값을 입력하고 빌드를 하면 app.config파일에 아래 처럼 코드들이 추가된다.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e054" >
<section name="WindowsFormsRegistry.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<userSettings>
<WindowsFormsRegistry.Properties.Settings>
<setting name="Email" serializeAs="String">
<value>xxxxx@gmail.com</value>
</setting>
</WindowsFormsRegistry.Properties.Settings>
</userSettings>
</configuration>
3.2 User Setting /user config=> 컴퓨터의 사용자별로 각자의 값을 저장,읽을 수 있다.
app.config와 다르게 user config는 현재 로그인된 계정의 사용자에 따라서 각자 값을 저장해준다,
Properties.Settings.Default.Email = "aaa@gmail.com";
Properties.Settings.Default.Save();
// 값을 불러올 때도 Properties.Settings.Default.Email 로 호출하면 된다
위의 코드를 실행하면
"C:\Users\계정\AppData\Local\WindowsFormsRegistry\WindowsFormsRegistry.exe_Url_jper2atmirkgdf1e1rftfbmrhyb5dncw\1.0.0.0"
해당 경로로 user.config 파일이 생성된다.
//user.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<userSettings>
<WindowsFormsRegistry.Properties.Settings>
<setting name="Email" serializeAs="String">
<value>aaa@google.com</value>
</setting>
</WindowsFormsRegistry.Properties.Settings>
</userSettings>
</configuration>
728x90
반응형
'스마트한 개발 공부 > WinForm' 카테고리의 다른 글
[C# Winform] C# 프로그램에서 DB연동하기 (0) | 2021.09.14 |
---|