Windows 11 앱 런처(QuickLaunch) 자체제작 v.1버전

// SIDE PROJECT · Electron + Node.js

바탕화면 더블클릭하다 빡쳐서 만든 앱 런처 — 개발 기간 1일

만든 이유

새벽에 게임 켜려고 바탕화면 더블클릭하다가 생각했다.

"왜 나는 매번 이걸 찾고 있지?"

바탕화면 아이콘은 지저분하고, 시작 메뉴는 무겁고, 검색창 치기는 귀찮고. 내가 원하는 앱만 모아놓은 위젯 하나면 되는데. 찾아봤는데 마음에 드는 게 없어서 직접 만들었다.

어떤 프로그램이냐면

USAGE
실행 → 바탕화면 우측 하단에 위젯이 떠있음
원하는 앱 클릭 → 바로 실행

이게 전부다. 심플하게. 추가로 붙인 기능들:

설치된 프로그램 자동 조회
Windows 레지스트리 읽어서 리스트 보여줌
드래그로 위치 이동
원하는 자리에 고정, 재실행해도 그 위치 유지
X 눌러도 종료 아님
트레이로 숨겨짐, 트레이 클릭하면 다시 나옴
항상 위에 표시 + 이모지 아이콘 선택
설정에서 토글, 실행파일 탐색기로 직접 선택 가능

기술 스택

Framework
Electron 28
Language
HTML / CSS / JS
Build
electron-builder
NSIS 인스톨러
Data
로컬 JSON
앱 목록, 설정, 창 위치

Electron 쓴 이유는 단순하다. 웹 기술로 데스크탑 앱 만들 수 있고, Windows API 접근도 되고, 빌드하면 EXE로 나오니까.

구조

PROJECT STRUCTURE
quicklaunch/
├── main.js ← Electron 메인 프로세스
│   (트레이, 창 생성, IPC, 레지스트리 조회)
├── preload.js ← 렌더러 ↔ 메인 IPC 브릿지
├── src/
│   └── index.html ← UI 전체 (HTML + CSS + JS)
└── package.json ← 빌드 설정 (NSIS 인스톨러)

파일 4개짜리 프로젝트다. 단순한 게 최고다.

설치된 프로그램 조회하는 방법

제일 재밌었던 부분. Windows 레지스트리에서 설치된 앱 목록을 PowerShell로 긁어온다.

main.js — 레지스트리 조회
const ps = `
  $paths = @(
    'HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*',
    'HKLM:\\Software\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*',
    'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\*'
  );
  $apps = @();
  foreach ($p in $paths) {
    if (Test-Path $p) {
      $apps += Get-ItemProperty $p |
        Where-Object { $_.DisplayName -ne $null } |
        Select-Object DisplayName, InstallLocation, DisplayIcon, Publisher
    }
  }
  $apps | Sort-Object DisplayName -Unique | ConvertTo-Json -Compress
`;

exec(`powershell -NoProfile -NonInteractive -Command "${ps}"`, ...);
⚠️
삽질 포인트
처음엔 레지스트리 경로 하나만 봤다가 앱이 절반밖에 안 나왔다. 64비트, 32비트, 사용자 설치 앱이 저장되는 경로가 각각 달라서 3개 다 뒤져야 한다.

창 위치 저장하는 방법

드래그로 옮기면 위치를 JSON에 저장하고, 다음 실행 시 그 위치에서 시작한다.

main.js — 위치 저장/복원
// 창 이동할 때마다 저장
win.on('moved', () => {
  const [x, y] = win.getPosition();
  fs.writeFileSync(winPosPath, JSON.stringify({ x, y }));
});

// 실행 시 불러오기
const savedPos = loadWinPos();
new BrowserWindow({
  x: savedPos ? savedPos.x : defaultX,
  y: savedPos ? savedPos.y : defaultY,
  ...
});

간단한데 이거 없으면 매번 위치 잡아야 해서 불편하다.

X 눌러도 종료 안 되게 하는 법

main.js — close 이벤트 가로채기
win.on('close', (e) => {
  e.preventDefault();  // 기본 종료 막기
  win.hide();          // 트레이로 숨기기
});

e.preventDefault() 하나로 해결된다. 완전 종료는 트레이 우클릭 → 완전 종료 로만 가능하게 해뒀다.

실행 화면

다운로드는 아래 구글 드라이브를 사용해주세요.

⚡ QuickLaunch v1.0
⌕ 앱 이름으로 검색...
설치된 프로그램 설정
🌐
Chrome
📁
탐색기
📝
메모장
🧮
계산기
🎮
Steam
💬
Discord
🎵
Spotify
추가
다크 게이밍 테마 · Orbitron 폰트
// 교훈
쓰기 불편하면 직접 만들면 된다.
어차피 개발자잖아.
Tags: #Electron #NodeJS #Windows #사이드프로젝트 #앱개발