[SwiftBeam #14] "윈도우 데스크탑의 감성" - 윈도우에서도 에어드랍처럼! Win32 API와 트레이 아이콘 구현기

2026. 6. 26. 20:46AI Product Building/SwiftBeam

반응형
SwiftBeam Series #14

윈도우에서도 에어드랍의 감성을!
데스크탑 네이티브 연동

Win32 API로 만드는 진짜 데스크탑 앱

🪟 💻 🔗 ⚡

지금까지 우리는 SwiftBeam의 모바일 환경과 공통 전송 로직에 집중해 왔습니다. 하지만 SwiftBeam 프로젝트의 진짜 목표는 '기기 간의 경계를 허무는 것'입니다. 그 경계의 가장 큰 축 중 하나가 바로 전 세계에서 가장 많이 쓰이는 데스크탑 OS인 윈도우(Windows)입니다. Flutter는 윈도우를 공식 지원하지만, 단순히 화면을 띄우는 것을 넘어 '진짜 윈도우 앱'처럼 느껴지게 하려면 네이티브의 깊은 곳을 건드려야 했습니다. 윈도우 데스크탑의 감성을 살리기 위한 기술적 도전기를 소개합니다.

1. 데스크탑 앱은 '창' 그 이상이어야 합니다

모바일 앱은 사용자가 화면을 보고 있을 때만 주로 동작하지만, 데스크탑 앱은 다릅니다. 특히 파일 전송 앱이라면 더욱 그렇죠. 사용자가 웹 서핑을 하거나 다른 문서를 작성하는 동안에도 SwiftBeam은 구석에서 조용히 파일을 받을 준비를 하고 있어야 합니다.

하지만 Flutter Desktop의 기본 설정만으로는 창을 닫으면 프로세스가 종료되거나, 배경에서 대기하는 기능을 구현하기 어려웠습니다. 이를 해결하기 위해 윈도우의 심장부인 Win32 API와 직접 대화해야 할 필요성을 느꼈습니다.

2. 시스템 트레이: "닫아도 닫힌 게 아니야"

윈도우 유저들에게 익숙한 '시스템 트레이(우측 하단 아이콘)' 기능은 SwiftBeam의 핵심 UX입니다. 창 상단의 'X' 버튼을 눌렀을 때 앱이 완전히 꺼지는 것이 아니라, 트레이로 숨어들어 백그라운드에서 파일 전송 요청을 대기하게 만드는 것이죠.

저는 이를 위해 system_tray 패키지와 함께 직접적인 윈도우 메시지 루프 제어를 가미했습니다. 트레이 아이콘을 우클릭하면 '열기', '종료'와 같은 커스텀 메뉴가 나타나고, 파일이 전송 중일 때는 트레이 아이콘이 깜빡거리며 상태를 알리는 등 세심한 디테일을 추가했습니다. 이제 사용자는 작업 표시줄을 어지럽히지 않고도 항상 SwiftBeam을 곁에 둘 수 있게 되었습니다.

3. Win32 API로 창의 한계를 넘다

Flutter 창의 기본 형태는 다소 밋밋합니다. 저는 SwiftBeam에 '데스크탑 앱다운 견고함'을 더하고 싶었습니다. Dart에서 C++ API를 호출할 수 있게 해주는 win32 패키지는 저에게 강력한 무기가 되었습니다.

  • 🛡️ 중복 실행 방지: 앱이 이미 켜져 있는데 또 실행하면, 새로운 창을 띄우는 대신 기존에 켜져 있던 창을 앞으로 가져오는(Bring to Front) 로직을 구현했습니다.
  • 📐 창 크기 제한: 레이아웃이 깨지지 않도록 최소/최대 창 크기를 고정하고, 윈도우의 '스냅 레이아웃' 기능과 자연스럽게 어우러지도록 설정했습니다.
  • 🎨 아크릴 효과(Acrylic Effect): 윈도우 11의 세련된 반투명 디자인을 적용하기 위해 네이티브 윈도우 스타일 속성을 조정했습니다.

4. 드래그 앤 드롭: 데스크탑의 직관적인 언어

모바일에서는 파일 탐색기를 열어 파일을 고르는 게 당연하지만, PC에서는 드래그 앤 드롭(Drag & Drop)이 훨씬 편합니다. 탐색기에서 파일을 집어 SwiftBeam 창 위에 툭 던지기만 하면 바로 전송 대기열에 추가되는 기능이죠.

이 기능을 구현하기 위해 윈도우의 파일 드롭 이벤트를 캡처하고, 이를 Flutter의 다트 코드로 전달하는 브릿지를 구축했습니다. "파일을 고르기 위해 버튼을 누르는" 수고를 덜어주는 것만으로도 PC에서의 사용성은 수십 배 향상되었습니다.

5. 플랫폼의 벽을 넘는다는 것의 의미

Flutter는 훌륭한 크로스 플랫폼 도구이지만, 각 OS의 정체성을 무시한 채 화면만 똑같이 띄운다면 그것은 반쪽짜리 앱에 불과합니다. SwiftBeam의 윈도우 버전은 윈도우 유저들이 기대하는 익숙한 동작 방식을 따르면서도, 내부적으로는 모바일과 동일한 강력한 전송 엔진을 공유합니다.

데스크탑의 자유로움을 만끽했다면, 이제는 다시 모바일의 현실적인 장벽으로 돌아갈 시간입니다. 다음 편에서는 안드로이드 개발자들의 영원한 숙제, 'Scoped Storage와 미디어 접근 권한'을 SwiftBeam이 어떻게 우아하게 해결했는지 이야기해 보겠습니다.

다음 편 예고: [SwiftBeam #15] "안드로이드의 까다로운 권한" - Scoped Storage와 미디어 접근 완벽 대응

윈도우 데스크탑의 강력한 기능을 활용하는 Team M2Y의 기술력!
사용자의 PC 환경을 더욱 풍요롭게 만드는 다른 프로젝트들도 확인해 보세요.

Team M2Y 윈도우 솔루션 구경하기 →
TAGS: 윈도우앱개발, FlutterDesktop, Win32API, 시스템트레이, SwiftBeam, 플러터, 데스크탑앱, 크로스플랫폼, 앱개발, 사용자경험, 기술블로그, 개발일지
반응형