C# Winform - 윈도우 시작 시 프로그램 자동 실행되게 하기 (설명, 샘플 코드)

반응형

개요

내가 C#으로 만든 윈도우 프로그램(Winform)이 컴퓨터를 켰을 때 자동으로 실행되게 하고 싶다.

C# 프로그램을 윈도우 시작 시 실행하게 하려면, 레지스트리에 추가하여 실행 목록에 추가해야 한다.

 

이번 포스팅에서는...

  1. 레지스트리를 추가하여 윈도우 시작 시 실행 목록에 추가하는 방법
  2. 레지스트리를 삭제하여 시작 실행 목록에서 제거하는 방법

에 대해서 다룬다.

 

해당 내용을 다룬 프로젝트는 깃허브에서 다운로드 가능하다,

단, 깃허브에서는 시작 시 자동 실행 레지스트리 추가, 삭제를 액션으로 상호작용하여야 하기 때문에 On/Off 버튼을 추가하였다.

 

GitHub - luvris2/CSharp-Winforms-Example

Contribute to luvris2/CSharp-Winforms-Example development by creating an account on GitHub.

github.com


윈도우 시작 시 프로그램을 실행하게 하려면?

윈도우 시작 시 자동 실행 기능을 구현하려면 운영체제 구성 설정을 변경해야 한다.

설정을 변경하기 위해서는 레지스트리(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# 프로그램에서 레지스트리를 추가한 화면 >

 

  •  C# 애플리케이션을 통해 윈도우 시작 시 실행하는 레지스트리 삭제

< C# 프로그램에서 레지스트리를 삭한 화면>

 

  • 윈도우 시작 시 실행되는 레지스트리를 추가한 뒤, 윈도우를 시작 했을 때
    • 자동으로 지정한 프로그램이 실행된 화면

<윈도우 시작 시 자동으로 프로그램이 실행된 예시 화면>


참고

반응형