개요
내가 C#으로 만든 윈도우 프로그램(Winform)이 컴퓨터를 켰을 때 자동으로 실행되게 하고 싶다.
C# 프로그램을 윈도우 시작 시 실행하게 하려면, 레지스트리에 추가하여 실행 목록에 추가해야 한다.
이번 포스팅에서는...
- 레지스트리를 추가하여 윈도우 시작 시 실행 목록에 추가하는 방법
- 레지스트리를 삭제하여 시작 실행 목록에서 제거하는 방법
에 대해서 다룬다.
해당 내용을 다룬 프로젝트는 깃허브에서 다운로드 가능하다,
단, 깃허브에서는 시작 시 자동 실행 레지스트리 추가, 삭제를 액션으로 상호작용하여야 하기 때문에 On/Off 버튼을 추가하였다.
- https://github.com/luvris2/CSharp-Winforms-Example
- 하위 디렉토리 : C#_Winform_StartUp_With_Window_Example
윈도우 시작 시 프로그램을 실행하게 하려면?
윈도우 시작 시 자동 실행 기능을 구현하려면 운영체제 구성 설정을 변경해야 한다.
설정을 변경하기 위해서는 레지스트리(Registry)를 이용한다.
레지스트리란 간단히 말해 윈도우에서 사용하는 운영체제 설정과 선택 항목을 담고 있는 데이터베이스를 의미한다.
즉, 레지스트리를 통해 운영체제가 시작되었을 때 특정 작업을 수행하도록 할 수 있다.
이전에는 각 프로그램마다 설정 정보가 담겨 있는 INI 파일이 사용되었지만,
시스템 여러 곳에 설정 파일이 퍼짐으로써 찾기가 쉽지 않았다.
이를 쉽게 관리하기 위해 윈도우 레지스트리가 도입되었다.
[ 윈도우 자동 시작 레지스트리 설정 경로 ]
사용자가 윈도우를 로그인할 때 실행되는 레지스트리 설정 경로는 다음과 같다.
- HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
- HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
[ 윈도우 자동 시작 설정 경로에 대한 설명 ]
위의 4가지 설정 경로를 통해 사용자 또는 컴퓨터에 대한 설정을 할 수 있다.
4가지 설정 경로가 무엇이 다른지 아래의 목록을 대입해서 확인해 보면 이해가 쉽다.
- HKEY_LOCAL_MACHINE : 모든 구성원이 로그인할 때
- HKEY_CURRENT_USER : 현재 사용자가 로그인 할 때
- Run : 사용자가 로그온 할 때마다 매 번 자동으로 실행
- RunOnce : 단 한 번만 프로그램을 실행하고 해당 레지스트리를 삭제
[ 예시 ]
예를 들어보자.
현재 사용자가 윈도우를 시작했을 때 매 번 자동으로 프로그램을 실행하게 하고 싶다.
그렇다면 레지스트리를 추가해야 할 경로는,
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run' 이다.
C# 코드로 레지스트리 다루기
Microsoft.Win32
레지스트리를 추가하고 삭제하려면 Microsoft.Win32 네임스페이스가 필요하다.
Microsoft.Win32 네임스페이스가 제공하는 기능은 다음과 같다.
- 운영 체제에서 발생한 이벤트를 처리하는 클래스 제공
- 시스템 레지스트리를 조작하는 클래스 제공
레지스트리 하위 키 찾기 (OpenSubKey)
우리는 레지스트리 내에서 '시작 시 프로그램 자동 실행 ' 경로가 있는 키의 위치를 검색하고 액세스 해야 한다.
하위 키를 검색하고 키에 대한 쓰기 여부를 지정할 때에는 OpenSubKey 메소드를 사용한다.
public Microsoft.Win32.RegistryKey? OpenSubKey (string name, bool writable);
- string : 열려는 하위 키의 이름 또는 경로를 입력한다.
- bool : 키에 대한 쓰기 권한 여부를 설정한다. (true: 쓰기 권한 허용)
윈도우 자동 실행에 대한 설명을 하는 포스팅이므로
OpenSubKey 메소드 외엔 다른 메소드는 설명을 따로 하지 않았다.
필요하다면 아래의 참고에서 다른 메소드들을 찾아보자.
포스팅의 목적처럼, 윈도우 시작 시 자동 실행을 해주는 키의 쓰기 권한을 설정하려면 다음과 같다.
// 현재 사용자가 윈도우에 로그인하면 프로그램을 자동 실행하는 레지스트리 경로
string regStartUpPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
// true : 키 쓰기 권한 허용
key = Registry.CurrentUser.OpenSubKey(regStartUpPath, true);
레지스트리 키 추가하기 (setValue)
위의 절차에서 레지스트리의 쓰기 권한을 얻었다.
이제 레지스트리의 값을 추가하여 시작 시 프로그램이 자동 실행되도록 해야 한다.
레지스트리에 값을 추가할 때에는 SetValue 메소드를 사용한다.
public void SetValue (string? name, object value);
- setValue : 지정된 레지스트리 키에 지정된 키/값을 설정한다.
- string : 저장할 값의 이름
- object : 저장할 데이터
윈도우 시작 시 자동 실행하려는 프로그램을 설정하려면 다음과 같다.
- 예시) 프로그램 이름 : BabyChat
- 예시) 프로그램 경로 : C드라이브 - BabyChat 폴더 - BabyChat.exe
/* 키 쓰기 권한 얻기 */
// 현재 사용자가 윈도우에 로그인하면 프로그램을 자동 실행하는 레지스트리 경로
string regStartUpPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
// true : 키 쓰기 권한 허용
key = Registry.CurrentUser.OpenSubKey(regStartUpPath, true);
/* 키 추가하기 */
string programName = "BabyCaht";
key.SetValue(programName, Environment.CurrentDirectory + "\\BabyChat.exe");
// Environment.CurrentDirectory : 현재 실행되고 있는 프로그램의 경로 반환
레지스트리 키 삭제하기 (deleteValue)
이번엔 레지스트리 키를 삭제하는 방법을 알아보자.
프로그램이 윈도우 시작 시 자동 실행되도록 하였다.
하지만 다시 사용자의 요구에 의해 자동 실행이 되지 않도록 설정을 변경해야 할 때가 있다.
이럴 때엔 레지스트리 키를 삭제하여 윈도우 시작 실행 목록에서 제거하면 된다.
레지스트리의 값을 삭제할 때에는 DeleteValue 메소드를 사용한다.
public void DeleteValue (string name, bool throwOnMissingValue);
- deleteValue : 지정된 레지스트리 키에서 지정된 값을 삭제한다.
- string : 삭제할 값의 이름
- bool : 예외 발생 여부
- true : 지정된 값이 없으면 예외 발생
- false : 지정된 값이 존재하지 않으면 아무 작업 수행하지 않음
위의 예시에서 등록한 레지스트리의 값을 삭제하려면 다음과 같다.
/* 키 쓰기 권한 얻기 */
// 현재 사용자가 윈도우에 로그인하면 프로그램을 자동 실행하는 레지스트리 경로
string regStartUpPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
// true : 키 쓰기 권한 허용
key = Registry.CurrentUser.OpenSubKey(regStartUpPath, true);
/* 키 삭제하기 */
string programName = "BabyCaht";
key.deleteValue(programName, false);
// false : 예외 발생 시 아무 작업 수행하지 않음
C# Winform 프로젝트에 로직 추가하기 (샘플 코드)
아래는 실제 프로젝트에 적용한 코드이다.
물론 포스팅 관련 내용의 코드만 남겨놨다. ^^;
using Microsoft.Web.WebView2.Core;
using Microsoft.Win32;
using System.Reflection;
using System.Reflection.Metadata;
using System.Windows.Forms;
namespace BabyChat
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
// 테스트를 위해 true / false 만 변경
StartWithWindow(false);
}
private void StartWithWindow(bool state)
{
string regStartUpPath = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run";
string programName = "BabyChat";
RegistryKey key = Registry.CurrentUser.OpenSubKey(regStartUpPath, true);
// 윈도우 시작 시 자동 실행
if (state)
key.SetValue(programName, Environment.CurrentDirectory + "\\BabyChat.exe");
// 윈도우 시작 시 자동 실행하지 않기
else
key.DeleteValue(programName, false);
}
}
}
- C# 애플리케이션을 통해 윈도우 시작 시 실행하는 레지스트리 추가
- C# 애플리케이션을 통해 윈도우 시작 시 실행하는 레지스트리 삭제
- 윈도우 시작 시 실행되는 레지스트리를 추가한 뒤, 윈도우를 시작 했을 때
- 자동으로 지정한 프로그램이 실행된 화면