마우스로 드래그하면 바로 번역되는 Windows 트레이 앱

WinDragTranslator 0.1.1을 만들며 정리한 개발 배경, 클립보드 기반 번역 흐름, OCR fallback, setup 배포 전환, 소스 비공개 릴리즈 방식에 대한 개발 기록

WinDragTranslator 0.1.1: 마우스로 드래그 + Ctrl C 하면 번역되는 작은 Windows 트레이 앱을 만들었다

Date: 2026-05-11 KST
Category: 개발
Project: WinDragTranslator
Release: GitHub Releases v0.1.1

최근에 개인적으로 쓸 Windows용 번역 도구를 하나 만들었다. 이름은 WinDragTranslator다. 거창한 프로그램은 아니고, Windows 트레이에 조용히 떠 있다가 텍스트를 마우스로 드래그해 선택 후 Ctrl+C를 하면 커서 근처에 번역 팝업을 띄워주는 작은 유틸리티다.

내가 원했던 건 단순했다. 브라우저가 아닌 환경에서 PDF, 문서, 개발 문서 등을 읽다가 영어 문장을 만났을 때 번역 사이트를 따로 열지 않고, 선택한 자리 근처에서 바로 한국어 번역을 보고 싶었다. 특히 마우스로 선택한 흐름을 끊지 않는 것이 중요했다.

이번에 배포한 버전은 0.1.1이고, 설치 파일은 아래에서 받을 수 있다.

이 프로젝트는 "번역 앱"이라기보다, 내가 자주 하는 읽기 흐름을 덜 끊기게 만들기 위한 작은 Windows 변역 도구에 가깝다.

Why I Built It

개발 관련 글을 읽다 보면 문장 하나만 빠르게 확인하고 싶은 순간이 많다. 문단 전체를 번역할 필요는 없고, 단어 하나만 보는 것도 부족한 상황이다. 기존 도구들은 대체로 다음 중 하나였다.

  • 브라우저 안에서만 잘 동작한다.
  • PDF나 데스크톱 앱에서는 흐름이 끊긴다.
  • 번역 화면이 너무 크거나 별도 창으로 열린다.
  • 복사, 붙여넣기, 번역 사이트 이동이 반복된다.

그래서 목표를 만들었다. 마우스로 선택하면 자동으로 번역하고, 결과는 작은 팝업으로만 보여준다. 사용자가 해야 할 일은 텍스트를 드래그하는 것뿐이다.

How It Works

현재 구조는 Windows 트레이 앱이다. 앱은 백그라운드에서 마우스 드래그 완료를 감지하고, 선택된 텍스트를 읽기 위해 아주 짧게 Ctrl+C를 보낸다. 이후 클립보드에 들어온 텍스트를 읽고, 가능한 경우 기존 클립보드 내용을 다시 복원한다.

대략적인 흐름은 이렇다.

  1. 사용자가 텍스트를 드래그해 선택한다.
  2. 앱이 드래그 종료를 감지한다.
  3. 선택 텍스트를 임시로 복사한다.
  4. 번역 API로 한국어 번역을 요청한다.
  5. 커서 근처에 작은 팝업을 띄운다.
  6. 기존 클립보드 내용을 복원한다.

기본 번역 제공자는 비공식 Google Translate endpoint를 사용한다. 별도 API 키는 필요 없지만, 선택한 텍스트가 외부 endpoint로 전송된다는 점은 알고 써야 한다. 그래서 개인 정보나 민감한 문장을 선택해 번역하는 용도로는 조심하는 것이 좋다.

OCR Fallback

일부 화면은 텍스트 선택이나 복사가 잘 되지 않는다. 이미지로 된 문서, 캡처 화면, 복사가 제한된 PDF 같은 경우가 그렇다. 이를 위해 OCR 모드도 넣었다.

OCR은 기본적으로 꺼져 있고, 트레이 메뉴에서 Enable OCR을 선택해야 켜진다. 사용 흐름은 다음과 같다.

  • 트레이 메뉴에서 OCR을 켠다.
  • Win + Shift + S로 화면 영역을 캡처한다.
  • Windows가 캡처 이미지를 클립보드에 넣는다.
  • 앱이 Windows OCR로 텍스트를 읽고 번역한다.

OCR 자체는 로컬 Windows OCR을 사용한다. 다만 OCR로 인식된 텍스트도 최종 번역 단계에서는 기본 번역 provider를 거치기 때문에, 온라인 번역을 쓴다면 외부 전송이 발생한다.

What Changed in 0.1.1

처음 만든 0.1.0 버전에서는 간헐적으로 앱이 튕기는 문제가 있었다. 원인은 클립보드 이미지 처리 쪽이었다.

Windows 클립보드는 생각보다 다양한 형식의 데이터를 가진다. 어떤 앱은 이미지처럼 보이는 데이터를 클립보드에 올리지만, WPF의 Clipboard.GetImage()가 그 데이터를 정상적으로 읽지 못하는 경우가 있다. 이때 CLIPBRD_E_BAD_DATA 예외가 발생했고, 그 예외가 UI 메시지 루프 밖으로 새면서 앱이 종료됐다.

0.1.1에서는 이 부분을 고쳤다.

  • 읽을 수 없는 클립보드 이미지는 오류가 아니라 "이미지 없음"처럼 처리한다.
  • 클립보드 이미지 읽기 실패가 앱 종료로 이어지지 않게 막았다.
  • 배포 파일에서 .pdb 같은 디버그 심볼을 제외했다.
  • 포터블 zip 외에 설치형 setup.exe를 만들었다.

작은 수정처럼 보이지만, 트레이 앱은 조용히 계속 살아 있는 것이 중요하다. 그래서 이번 버전의 핵심은 기능 추가보다 안정성 개선에 가깝다.

Portable vs Setup

처음에는 포터블 zip으로만 배포했다. 압축을 풀고 실행하면 되니 간단하다고 생각했다. 하지만 트레이 앱은 일반적인 포터블 도구보다 설치형이 더 자연스럽다.

설치형으로 바꾸면 이런 장점이 있다.

항목 포터블 설치형
실행 방식 압축 해제 후 직접 실행 설치 후 시작 메뉴에서 실행
제거 사용자가 폴더 삭제 Windows 앱 제거 항목 사용
시작 프로그램 직접 설정 필요 설치 옵션으로 제공 가능
사용자 경험 개발자 도구 느낌 일반 앱 느낌

그래서 이번 릴리즈부터는 setup.exe를 권장 다운로드로 두고, 포터블 zip은 대체 다운로드로 남겼다.

How To Use It

설치 후 사용법은 간단하다.

  1. 설치 파일을 내려받아 설치한다.
  2. WinDragTranslator를 실행한다.
  3. 작업 표시줄 알림 영역에 트레이 아이콘이 생긴다.
  4. 영어 문장을 마우스로 드래그해 선택한다.
  5. Ctrl + C를 누른다.
  6. 커서 근처에 번역 팝업이 표시된다.

트레이 아이콘을 우클릭하면 다음 메뉴를 쓸 수 있다.

  • Pause: 자동 번역 일시 중지
  • Resume: 자동 번역 재개
  • Enable OCR: OCR 모드 켜기
  • Disable OCR: OCR 모드 끄기
  • Exit: 앱 종료

What I Want To Improve Next

아직 초기 버전이라 개선할 부분이 많다.

  • 설정 저장 기능
  • 번역 provider 선택 기능
  • DeepL, OpenAI, 로컬 모델 provider 추가
  • 팝업 UI 개선
  • 번역 기록 옵션
  • 자동 업데이트 또는 업데이트 알림
  • 코드 서명 여부 검토

특히 provider 구조는 계속 분리해 둘 생각이다. 클립보드/마우스 입력/팝업 표시 코드는 번역 엔진과 느슨하게 연결되어 있어야 한다. 그래야 나중에 온라인 번역, 개인 API 키 기반 번역, 로컬 모델 번역을 바꿔 끼우기 쉽다. (하지만 지금 성능으로도 어느정도 만족해서 굳이 개선해야되는가 싶긴 함)

My Read

WinDragTranslator는 큰 제품이라기보다 내 작업 흐름에서 생기는 작은 불편을 줄이기 위한 도구다. 하지만 이런 작은 유틸리티를 만들 때도 생각할 지점은 꽤 많았다.

클립보드는 민감한 영역이고, 전역 마우스 훅은 조심해서 써야 하며, 온라인 번역은 외부 전송을 동반한다. 설치 파일을 배포할 때는 사용자 경험뿐 아니라 소스 노출, 디버그 심볼, 업데이트 방식도 고민해야 한다.

이번 0.1.1은 그 첫 정리 버전이다. 아직 완성형은 아니지만, 적어도 "드래그해서 바로 번역한다"는 핵심 흐름은 잡혀서 나름 유용하게 쓸 것 같다.

Links