안녕하세요! 오늘은 프로그램에서 윈도우 레지스트리를 사용하는 방법을 정리해보았습니다.
프로그램이 실행될 때, 레지스트리에 저장된 데이터를 불러와서 기존의 환경을 유지할 수 있습니다.
저는 보통 프로그램 설정창에 데이터를 저장하는데 레지스트리를 사용하는 편입니다.
레지스트리란
윈도우 계열 시스템 구성 정보를 저장한 데이터 베이스를 의미합니다.
레지스트리는 Key, Value로 이루어져 있습니다.
아래 그림의 5가지 항목을 하이브라고 합니다.
전 응용 프로그램이 가지는 데이터를 보관하기 위해 [HKEY_CURRENT_USER\SOFTWARE\프로그램이름] 을 Key로 하여 접근 후 Name, Value를 등록하여 데이터를 저장합니다.
이제 레지스트리를 사용하는 방식을 정리하겠습니다.
레지스트리의 사용
- 클래스 라이브러리를 생성하고 RegistryInfo.cs를 생성한다.
- gRegKey 변수 선언:: [레지스트리의 경로]
- gRegName[이름] 변수 선언 :: [저장하고 싶은 내용]
ex) gRegNameMainTitle : 메인 타이틀 정보 - 레지스트리를 불러오는 GetRegistry 함수 생성
- 레지스트리에 값을 쓰는 SetRegistry 함수 생성
- 메인에서 클래스 라이브러리를 참조한 뒤 사용
- 레지스트리 내용이 Read 및 Write가 되는지 확인한다.
1번 작업
클래스 라이브러리를 생성하고 RegistryInfo.cs를 생성한다.
2~5번 작업
//Registry를 사용하기 위해 Win32 API를 사용한다.
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Reg
{
public class RegistryInfo
{
//레지스트리 Key값을 설정한다.
private const string gRegKey = @"Software\LBH\WPF_Project";
//Key 경로에 등록할 이름을 설정한다.
private const string gRegNameMainTitle = @"MainTitle";
//key, name, default값을 인자로 사용하여 key가 존재하는지 확인한다.
//key가 존재하지 않으면 새로 생성하고 default값을 넣는다.
//만약 key가 존재하면 저장되어 있는 값을 리턴한다.
//여기서 다양한 자료형이 호환될 수 있게 반환형을 T로 설정했다.
//참고로 T는 제네릭 클래스이다.
//key를 Open했으면 당연히 Close해서 닫아줘야한다.
private static T GetRegistry<T>(string key, string name, T defVal )
{
T val = defVal;
RegistryKey reg = Registry.CurrentUser.OpenSubKey(key, true);
if(reg == null)
{
reg = Registry.CurrentUser.CreateSubKey(key);
reg = Registry.CurrentUser.OpenSubKey(key, true);
reg.SetValue(name, defVal);
}
else
{
try
{
val = (T)reg.GetValue(name);
if (val == null)
{
reg.SetValue(name, defVal);
val = defVal;
}
}
catch(Exception ex)
{
Debug.WriteLine(ex.Message);
reg.SetValue(name, defVal);
val = defVal;
}
}
reg.Close();
return val;
}
//key값을 통해 val값을 저장한다.
//만약 key값이 없으면 새로 생성하고 val값을 넣는다.
//key를 Open했으면 당연히 Close해서 닫아줘야한다.
private static void SetRegistry<T>(string key, string name, T val )
{
try
{
RegistryKey reg = Registry.CurrentUser.OpenSubKey(key, true);
if(reg == null)
{
reg = Registry.CurrentUser.CreateSubKey(key);
}
reg.SetValue(name, val);
reg.Close();
}
catch(Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
//외부에서 값을 불러올 수 있도록 생성한 함수이다.
public static string GetMainTitle(string defVal = "Default")
{
return GetRegistry(gRegKey, gRegNameMainTitle, defVal);
}
//외부에서 값을 쓸 수 있도록 생성한 함수이다.
public static void SetMainTitle(string val)
{
SetRegistry(gRegKey, gRegNameMainTitle, val);
}
}
}
RegistryInfo.cs를 만들고 해당 클래스 라이브러리를 빌드한다.
6번 작업
WPF_Project 참조에 Registry를 추가한다.
참조가 완료되면 MainWindow.xaml.cs에서 namespace를 선언한다. (ex using Reg;)
📌MainWindow.xaml
<Window x:Class="WPF_Project.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WPF_Project"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Closing="Window_Closing">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBox x:Name="txtBox" Width="200" Height="50"></TextBox>
<Button Grid.Column="1" x:Name="btnChangeTitle" Margin="20" Click="btnChangeTitle_Click">변경</Button>
</Grid>
</Window>
📌MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Reg;
namespace WPF_Project
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
//프로그램이 실행될 때 레지스트리에서 값을 불러와서 타이틀을 설정한다.
Title = RegistryInfo.GetMainTitle();
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//프로그램이 종료되면 마지막으로 설정된 Title 값을 레지스트리에 저장한다.
RegistryInfo.SetMainTitle(Title);
}
//버튼을 누르면 TextBox의 내용을 Title 변수에 저장한다.
private void btnChangeTitle_Click(object sender, RoutedEventArgs e)
{
string text = txtBox.Text;
if(!string.IsNullOrEmpty(text))
{
Title = text;
}
else
{
Title = "empty";
}
}
}
}
7번 작업
레지스트리를 이용한 작업이 성공적으로 수행되는 지 확인한다.
✔ 프로그램 실행 시 레지스트리 경로가 생성되는 지 확인합니다.
처음 실행 시 레지스트리에 key가 없기 때문에 name, defVal로 새로 생성합니다.
✔ TextBox에 텍스트 입력 후 버튼을 눌러 Title 변경을 확인합니다.
✔ 프로그램 종료 시 hello world라는 타이틀 내용이 레지스트리에 저장되는 지 확인합니다.
✔ 프로그램을 재실행하면 마지막으로 MainTitle에 저장된 값이 타이틀에 적용됩니다.
이상으로 프로그램 데이터를 레지스트리에 저장, 불러오기 하는 방법이었습니다.
감사합니다.
'C#' 카테고리의 다른 글
[C#] - async/await 사용 (0) | 2023.01.11 |
---|---|
[C#] - 프로그램의 실행 과정 (1) | 2022.12.28 |