키보드 전달
MacBook에서 치는 모든 키가 iMac으로 갑니다. Caps Lock 한/영 전환은 iMac의 보조 키에서 이 MacBook을 골라 한 번 지정합니다.
macOS 메뉴바 앱
iMac에는 아무것도 설치하지 않습니다. 블루투스 페어링 한 번이면 MacBook의 키보드와 트랙패드를 iMac에서 그대로 씁니다. 관리자 권한이 없는 관리형 iMac에서도 됩니다.
소개
MacBook을 그대로 iMac 앞에 놓고 쓰는 상황을 위해 만들었습니다. 키·트랙패드를 iMac으로 보내고, 단축키 하나로 돌아오고, 자리를 옮겨도 다시 붙습니다.
MacBook에서 치는 모든 키가 iMac으로 갑니다. Caps Lock 한/영 전환은 iMac의 보조 키에서 이 MacBook을 골라 한 번 지정합니다.
이동·클릭·두 손가락 스크롤을 iMac의 마우스로 전달합니다. 포인터 배율은 1×~4×. iMac 입력 중에는 MacBook 포인터가 제자리에 숨겨져 두 화면에서 동시에 움직이지 않습니다.
⌥⌘K로 MacBook ↔ iMac 입력을 오갑니다. iMac 입력 중에는 메뉴바 아래 주황색 상자가 떠 있어 지금 어디에 치고 있는지 헷갈리지 않습니다.
iMac이 깨어나면 다시 붙고, 쓰던 중이었다면 iMac 입력으로 자동 복귀합니다. 로그인 화면에서 바로 암호를 칠 수 있습니다.
iMac 입력 중에는 MacBook 화면을 어둡게 하거나 끕니다. 돌아오면 원래 밝기로 복원합니다.
연결한 적 있는 iMac이 메뉴에 아이콘과 이름으로 남습니다. 자리를 옮겨 다른 iMac에서 연결해 오면 그 iMac을 새 대상으로 기억합니다.
iMac 쪽에는 프로그램도, 관리자 권한도 필요 없습니다. iMac은 BTS Key를 평범한 블루투스 키보드·마우스로 봅니다.
설치
요구 사항: macOS 13 Ventura 이상(Apple 실리콘 Mac), 블루투스. iMac 쪽은 블루투스만 있으면 어느 macOS든 됩니다.
위의 macOS용 다운로드 버튼을 누르면 최신 버전 BTSKey-<버전>.dmg를 받습니다. 첨부된 .sha256으로 무결성을 확인할 수 있습니다.
DMG를 열고 BTS Key 아이콘을 Applications 폴더로 끌어 놓습니다.
응용 프로그램에서 BTS Key를 control-클릭(오른쪽 클릭) → 열기 → 열기. Apple 개발자 인증서로 서명·공증되지 않은 앱이라 첫 실행 때만 이 절차가 필요합니다.
앱이 안내 창을 띄웁니다. Bluetooth·손쉬운 사용·입력 모니터링 권한을 허용하고 iMac과 페어링하면 준비가 끝납니다. 안내는 메뉴 → 도움말 → 사용 방법 보기로 언제든 다시 볼 수 있습니다.
사용 방법
네 단계면 됩니다. 권한과 페어링은 처음 한 번, 연결은 iMac이나 MacBook 어느 쪽에서든, 전환은 ⌥⌘K.
첫 실행 안내가 Bluetooth·손쉬운 사용·입력 모니터링 권한을 차례로 요청합니다. 세 가지가 모두 허용돼야 키와 트랙패드를 가로챌 수 있습니다. 메뉴 → 도움말 → 권한 확인에서 상태를 봅니다.
MacBook의 시스템 설정 → Bluetooth 화면을 열어 둔 채로, iMac의 시스템 설정 → Bluetooth에서 이 MacBook 옆 연결을 누릅니다. MacBook은 그 화면이 열려 있는 동안에만 검색됩니다. 양쪽에 같은 숫자가 보이면 승인합니다. 관리자 권한은 필요 없습니다.
앱이 5초 안에 새 페어링을 알아채고 스스로 연결합니다. 그 뒤로는 iMac의 Bluetooth 설정에서 BTS Key 옆 연결을 누르거나, MacBook 메뉴바의 키보드 아이콘 → iMac 이름을 누릅니다. 연결되면 아이콘이 외곽선 키보드로 바뀌고 화면 가운데에 "연결됨"이 뜹니다.
⌥⌘K로 iMac 입력으로 넘어가고, 같은 키로 돌아옵니다. iMac 입력 중에는 메뉴바 아래 주황색 상자가 떠 있고 MacBook 포인터는 제자리에 숨겨집니다. 화면 잠금·잠자기·연결 끊김 때는 자동으로 MacBook 입력으로 돌아오므로 MacBook을 조작하지 못하는 일이 없습니다.
동작 원리
MacBook이 Bluetooth Classic HID 장치(키보드+마우스 조합)를 흉내 냅니다. 소프트웨어 KVM과 달리 네트워크도, iMac 쪽 프로그램도 필요 없습니다.
IOBluetooth로 HID 서비스 레코드(SDP)를 게시합니다. 그러면 iMac이 페어링된 키보드에 하듯 L2CAP 제어·인터럽트 채널을 열어 옵니다. MacBook에서 먼저 열 수도 있습니다.
iMac 입력 모드에서는 CGEvent 탭이 키·트랙패드 이벤트를 가로채 USB HID 리포트로 바꿉니다. 탭은 전용 스레드에서 돌아, 블루투스 쪽이 멈춰도 MacBook 입력은 멈추지 않습니다.
리포트는 인터럽트 채널로 8ms 단위로 보냅니다. 마우스 델타는 16비트라 빠른 스와이프도 뭉개지지 않습니다.
왜 이 설계인지, 무엇을 시험했는지는 분석·설계 문서와 연결 과정 감사 기록에 있습니다.
진행 상황
macOS용은 실제 iMac에서 연결·재연결·한/영 전환까지 확인해 릴리스했습니다. 그 밖의 항목은 아래와 같이 정리했습니다.
| 항목 | 상태 | 비고 |
|---|---|---|
| 키보드·트랙패드 전달, 입력 전환 | 완료 | iMac 두 대 이상에서 확인 |
| 새 iMac 자동 감지·연결 | 완료 | 페어링 뒤 5초 안에, 앱이 꺼져 있던 동안의 페어링도 |
| 끊김 뒤 재연결 규칙 | 완료 | 자동 1회, iMac이 해제하면 0회, 그 뒤는 메뉴에서 |
| iMac이 시작하는 연결(잠자기 복귀, "연결") | 완료 | iMac의 시도부터 약 25초 |
| Caps Lock 한/영 전환 | 완료 | iMac의 보조 키 설정 한 번 필요 |
| 화면 표시(HUD)·첫 실행 안내 | 완료 | 게이지가 0이 되면 사라짐, 닫기 단추 |
| Windows용 | 분석 완료 | 개발 전. 아래 참고 |
| 파일·클립보드 전달 | 범위 제외 | iMac 쪽 설정이나 별도 앱 조작이 필요해 별도 프로젝트로 |
Windows 개발 계획
Windows용은 분석까지 마쳤고 개발은 시작하지 않았습니다. 결론은 "리포트 규격과 로직은 Swift 단일 소스, 전송·입력 캡처·UI는 C#/.NET으로 별도 구현"입니다. 공용 코어는 이미 Apple 외 플랫폼에서 빌드됩니다.
| 계층 | macOS | Windows | 공유 |
|---|---|---|---|
| 리포트 규격·인코딩·키코드·상태 머신 | 순수 Swift | 순수 로직 | 가능 |
| 블루투스 전송 | Classic HID (IOBluetooth) | BLE HID over GATT (WinRT GattServiceProvider) | 인터페이스만 |
| 입력 캡처 | CGEvent 탭 | WH_KEYBOARD_LL / WH_MOUSE_LL 훅 + ClipCursor | 별도 |
| UI | 메뉴바 (AppKit) | 트레이 (C#/.NET) | 별도 |
Windows 인박스 블루투스 스택에는 Classic HID 장치 역할 API가 없습니다. 양쪽에서 공개 API로 동작하는 것은 BLE HID over GATT뿐이며, Windows 쪽 어댑터가 주변장치(peripheral) 역할을 지원해야 합니다. 저가 USB 어댑터 다수가 지원하지 않습니다.
Windows 인박스 스택에 Classic HID 장치 역할이 없고 BLE HID 서비스는 막혀 있지 않음을 Microsoft 문서로 확인. 공개 참고 구현(windows-ble-hid, MIT)이 macOS 호스트에서 동작한다고 보고하나 재현하지는 않음. 스택 선택지를 다시 비교해 C#/.NET으로 결정.
macOS 전용 타깃을 분리해 HIDCore와 테스트 134개가 Linux에서 그대로 빌드·통과. Windows에서는 아직 실행하지 않았으며, 설치·빌드 절차는 Windows 빌드 안내에 있음.
참고 구현을 Windows 노트북에서 빌드해 어댑터의 주변장치 역할, Mac 호스트와의 페어링·재연결·잠자기 복귀, 보조 키 설정을 통한 한/영 전환을 확인한다.
C#/.NET: WinRT GattServiceProvider 전송, 저수준 키보드·마우스 훅(전용 스레드), 트레이 UI. 코어는 C#으로 옮기고 Swift 코어와 바이트 단위 시험 벡터를 공유한다.
Windows 10 2004+·11, Intel/ASUS/TP-Link 어댑터, 대상 macOS 13~26. 서명 없는 빌드는 Windows 11 스마트 앱 컨트롤에 막히므로 서명 방법을 정한다.
문제 해결 · 지원
메뉴 → 도움말 → 진단 로그 내보내기가 데스크탑에 텍스트 파일을 만듭니다. 그 파일을 첨부해 이슈를 남겨 주세요.
앱이 HID 서비스를 등록하기 전에 iMac이 연결해 오면 macOS가 그 연결을 대신 받습니다. 앱의 Bluetooth 권한 창에 먼저 응답하고, 메뉴에서 iMac 이름을 눌러 다시 연결하세요. 앱은 등록될 때까지 1초마다 재시도합니다.
iMac의 보조 키 설정은 키보드마다 따로 저장됩니다. iMac의 시스템 설정 → 키보드 → 키보드 단축키 → 보조 키에서 맨 위 "키보드 선택"을 눌러 이 MacBook을 고른 뒤 Caps Lock 키를 🌐 fn 기능으로 바꾸세요. "🌐 키를 누를 때"는 "입력 소스 변경"이어야 합니다. iMac의 설정이 초기화되면 다시 합니다.
MacBook의 시스템 설정 → Bluetooth 화면을 열어 둔 채로, 새 iMac의 Bluetooth 설정에서 이 MacBook 옆 연결을 눌러 페어링합니다. MacBook은 그 화면이 열려 있는 동안에만 검색됩니다. 앱이 5초 안에 새 페어링을 알아채고 스스로 연결합니다. 이전 iMac에 연결돼 있었다면 목록에만 추가합니다. 앱은 대상이 아닌 iMac을 호출하지 않습니다.
정상입니다. iMac이 직접 연 연결은 macOS가 앱에 넘겨주지 않고, 앱은 그 연결이 끊어진 뒤에야 iMac이 키보드를 찾았다는 것을 알 수 있습니다. 그래서 약 25초 뒤에 MacBook 쪽에서 연결합니다. iMac 화면에는 "연결됨"이 잠깐 떴다가 사라진 뒤 다시 연결됩니다. 더 빨리 쓰려면 MacBook 메뉴의 지금 다시 연결을 누르세요(4~5초).
아니요. 4초 뒤 한 번만 자동으로 시도하고 멈춥니다. iMac에서 "연결 해제"를 누른 경우에는 자동으로 시도하지 않습니다. 그 뒤에는 메뉴의 지금 다시 연결을 누르세요. 반복해서 시도하면 MacBook에 연결된 다른 블루투스 기기가 끊기거나 느려지기 때문입니다.
메뉴 → 설정 → 포인터 배율을 2×~3×로 올리세요. iMac 쪽 시스템 설정 → 마우스 → 이동 속도도 함께 조정합니다.
서명 인증서가 없는 빌드라 macOS가 버전마다 새 앱으로 봅니다. 손쉬운 사용·입력 모니터링을 다시 허용하면 됩니다.
iMac은 처음 페어링할 때 받은 키보드 구조를 기억합니다. iMac의 Bluetooth 설정에서 이 MacBook을 삭제하고 다시 페어링하세요.