하드웨어 제로 키보드 라이트 구현: C#, WPF 및 OLED 효율성을 활용한 여정
요약
본 글은 C#과 WPF를 사용하여 모니터의 반사광을 활용해 키보드를 비추는 'LightBar For Keyboard' 애플리케이션 개발 과정을 다룹니다. Windows API를 이용해 데스크톱 작업 표시줄처럼 동작하게 구현하고, OLED 디스플레이 특성에 맞춰 녹색/빨간색 등 고효율 색상 프로필을 적용하여 전력 소모를 최적화하는 방법을 설명합니다.
핵심 포인트
- Windows AppBar API를 활용하여 최대화된 창에 가려지지 않는 데스크톱 툴바 구현
- Mutex를 사용하여 애플리케이션의 단일 인스턴스 실행 환경 강제
- OLED 특성을 고려한 녹색/빨간색 등 고효율 색상 프로필 적용으로 전력 절감
서버 마이그레이션과 코드 아키텍처 작업으로 늦게까지 밤을 새우는 경우가 많아, 낮은 조명 환경에서 타이핑하는 일이 잦습니다. USB 램프나 백라이트 키보드가 일반적인 해결책이지만, 이는 추가 전력을 소모하고 물리적인 지저분함을 더합니다. 저는 궁극적인 광원 자체가 이미 제 바로 앞에 있다는 것을 깨달았습니다: 모니터입니다.
명확한 비전을 가지고, 저는 Google의 Gemini AI와 협력하여 LightBar For Keyboard라는 제품을 빠르게 프로토타이핑하고 개선했습니다. 이 라이트바는 화면 하단에 반사광 바를 만들어 키보드를 밝혀주는 가벼운 Windows 애플리케이션입니다. 여기서는 C#과 WPF를 사용하여 어떻게 구축했는지, 화면 공간 관리를 위해 Windows API를 어떻게 다루었는지, 그리고 최신 OLED 에너지 소비에 맞춰 어떻게 최적화했는지를 설명합니다.
핵심 과제: 데스크톱 툴바 (AppBar)
라이트 바를 만드는 가장 간단한 접근 방식은 테두리 없는 최상위 창입니다. 하지만 즉각적인 UX 결함은 최대화된 애플리케이션(Chrome이나 Visual Studio 같은)이 이 바를 가리거나 부분적으로 가릴 수 있다는 것입니다.
이를 해결하기 위해, 애플리케이션은 Windows 작업 표시줄처럼 동작해야 했습니다. 저는 shell32.dll의 SHAppBarMessage를 사용하여 네이티브 Windows Application Desktop Toolbar (AppBar) API를 구현했습니다.
- 도킹 모드 (Docked Mode): 애플리케이션을 AppBar로 등록하고 가장자리(edge)를
ABE_BOTTOM으로 설정함으로써, Windows는 데스크톱의 작업 영역을 자동으로 재계산합니다. - 결과: 최대화된 창들은 위쪽으로 밀려나게 되어, 라이트 바가 완전히 보이도록 보장하며 어떤 기본 애플리케이션 UI도 가리지 않습니다.
- 플로팅 모드 (Floating Mode): 화면 하단에 임시 접근이 필요한 사용자를 위해, AppBar를 등록 해제하고
MouseLeftButtonDown을 통해 표준 드래그 앤 드롭 창 이동 기능을 활성화하는 상태 토글을 추가했습니다.
단일 인스턴스 강제 적용 (Enforcing a Single Instance)
애플리케이션이 데스크톱 작업 영역을 직접 조작하기 때문에, 여러 개의 중첩된 인스턴스가 실행되면 UI 오류가 발생할 수 있습니다. 이를 방지하기 위해, 저는 App.xaml.cs에 Mutex를 구현하여 단일 인스턴스 제약을 보장했습니다.
OLED 효율성 전환
초기에는 애플리케이션이 순수한 흰색 막대를 표시했습니다. 표준 LCD 패널(IPS, TN, VA)의 경우 모니터 백라이트가 어차피 완전히 켜져 있습니다. 화면 하단에 흰색 막대를 표시하는 것은 단순히 액정 분자를 비틀어 기존 빛이 통과하도록 하는 것일 뿐입니다. 추가 전력 소모는 문자 그대로 0W입니다.
하지만 OLED 디스플레이는 픽셀별로 빛을 생성합니다. 넓은 모니터 하단 전체에 모든 RGB 서브픽셀을 작동시켜 완전한 흰색 막대를 표시하는 것은 약 2.0W를 소비합니다. 따라서 소프트웨어를 최신 디스플레이에서 고효율로 만들기 위해, 특정 서브픽셀을 목표로 하는 사용자 지정 색상 프로필을 도입했습니다:
- 순수 녹색 (RGB 0, 255, 0): 인간의 눈은 녹색 빛에 매우 민감합니다. 이는 파란색 및 빨간색 서브픽셀을 완전히 우회하면서 검은색 키보드 키를 읽는 데 최대 대비를 제공합니다. 소비 전력: ~0.5W (75% 절약).
- 순수 빨강 (RGB 255, 0, 0): 야간 시력을 보호하는 데 탁월하여 사용자가 눈의 피로 없이 화면에서 시선을 돌릴 수 있게 합니다. 소비 전력: ~0.3W (85% 절약).
- 노랑 (RGB 255, 191, 0): 빨간색과 녹색을 혼합하여 얻는 따뜻하고 눈에 친화적인 빛으로, 전력 소모가 큰 파란색 서브픽셀을 완전히 꺼둡니다. 소비 전력: ~0.8W (60% 절약).
사용자는 하드웨어 및 조명 환경 선호도에 따라 막대를 마우스 오른쪽 버튼으로 클릭하여 이러한 프로필 간을 원활하게 전환할 수 있습니다.
배포 및 SmartScreen 현실
저는 .NET 10.0을 사용하여 자체 포함형 단일 파일 실행 파일로 프로젝트를 패키징했습니다:
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
배포를 위해 Inno Setup 설치 프로그램을 생성했습니다. 무료 도구를 공개하는 독립 개발자로서 값비싼 EV 코드 서명 인증서를 구매하는 것이 항상 실용적이지는 않습니다. 결과적으로, 초기 사용자들은 전형적인 Windows Defender SmartScreen의 'Windows가 PC를 보호합니다' 파란색 프롬프트를 마주하게 될 것입니다. 저는 문서에 간단한 면책 조항을 추가하여 사용자들이 추가 정보(More info) > **사용해도됨(Run anyway)**을 클릭하도록 안내했습니다. 소프트웨어 다운로드가 자연스럽게 늘어나면서 Microsoft SmartScreen 평판이 구축되는 것을 알기에 그러는 것입니다.
마무리하며 (Wrapping Up)
이 유틸리티를 만들고, Gemini와 개발 과정을 함께 진행한 것은 레거시 Windows API와 현대적인 하드웨어 고려 사항을 결합하는 매우 만족스러운 경험이었습니다. 이는 하드웨어 문제에 대한 완전히 무료의 소프트웨어 전용 해결책입니다.
직접 사용해 보거나, 코드를 확인하거나, 컴파일하고 싶다면 전체 프로젝트는 GitHub의 LightBarForKeyboard Repository에서 오픈 소스로 공개되어 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기