햅틱 펜 구현 가이드
이 문서는 호환되는 Windows 11 호스트에 연결하는 햅틱 펜 디바이스에 대한 프로토콜 구현에 대해 자세히 설명합니다. 여기에는 펜 변환기 내에서 햅틱 응답을 생성하기 위한 기계적 제약 조건, 전기적 제약 조건 또는 구성 요소 선택에 대한 지침이 포함되지 않습니다. 이 구현 지침은 펜 변환기와 펜 디지타이저 간에 사용되는 펜 프로토콜과 무관하지만 구현 시 펜 디지타이저가 햅틱 반응 변조 목적으로 펜 변환기에 추가 매개 변수를 제공할 수 있도록 하는 업링크 기능이 있는 펜 프로토콜을 사용하도록 선택할 수 있습니다.
디바이스 클래스
햅틱 펜은 Windows의 펜 디바이스 클래스의 확장입니다. 이 구현 가이드는 펜 구현 가이드에 추가되고 펜 변환기 내 햅틱 구현에 중점을 두므로 햅틱 펜은 여기에 포함된 요구 사항 외에도 펜 구현 가이드의 요구 사항을 충족해야 합니다.
디바이스 버스 연결
햅틱 펜은 Microsoft에서 제공한 기본 제공 드라이버를 사용하여 Bluetooth를 통해 HID를 사용하여 Windows 호스트에 연결합니다.
햅틱 펜 프로토콜 구현
여기에 제공된 정보를 이해하려면 HID 프로토콜을 잘 이해해야 합니다. HID 프로토콜에 대한 정보는 다음 리소스를 참조하세요.
Windows에는 HID 클래스 드라이버와 해당 HID Bluetooth 지원 미니포트 드라이버가 포함되어 있으므로 타사 미니 포트 드라이버가 필요하지 않습니다. 햅틱 펜 디바이스 펌웨어는 이 항목에 설명된 사용만 보고하면 됩니다. Windows는 펌웨어와 자체 HID 드라이버를 사용하여 디바이스를 사용하도록 설정하고 Windows 애플리케이션에 디바이스에 대한 액세스 권한을 부여합니다.
샘플 설명자는 아래의 샘플 보고서 설명자 섹션에서 제공됩니다.
필수 최상위 HID 컬렉션

햅틱 펜 디바이스는 디지타이저/스타일러스로 표시되는 최상위 컬렉션을 제공하는 방식으로 Windows 10 시스템에서 HID 프로토콜을 사용해야 합니다(페이지 0x0D, 사용량 0x20).
펜 디지타이저 입력 보고서
펜 디지타이저 컬렉션은 OS에 보고된 입력 보고서에서 변환기 일련 번호와 변환기 공급업체 ID로 구성된 스타일러스 식별자를 보고해야 합니다. 스타일러스 컬렉션을 통해 동일한 스타일러스 식별자를 보고해야 합니다. 이를 통해 OS는 디지타이저에서 생성된 펜 입력을 스타일러스에 연결할 수 있습니다. 펜 구현 가이드에 대한 자세한 내용은 펜 프로토콜 구현에서 확인할 수 있습니다.
변환기 일련 번호
변환기 일련 번호는 펜 디지타이저와 통신하는 펜 액세서리에 사용되는 변환기의 고유 영구 식별자입니다. 이는 32비트여야 하며, 변환기 공급업체 ID로 식별되는 공급업체 또는 엔터티에서 정의합니다.
참고
Windows는 32비트 식별자만 지원하며, 사용법 0x6E를 통해 확장되는 64비트 식별자는 지원하지 않습니다. 이는 향후 변경될 수 있습니다.
| 페이지 | ID | 메모 |
|---|---|---|
| 0xD | 0x5B | 고유한 펜 식별에 의존하는 기능의 경우 필수(아래 참조) |
변환기 공급업체 ID
변환기 공급업체 ID는 펜 디지타이저와 통신하는 펜 액세서리에 사용되는 변환기 제조업체를 전달하기 위한 필드입니다. 이는 제조업체 또는 이 목적을 위해 USB-IF 공급업체 ID 사용을 승인하는 IHV/OEM의 2바이트 USB-IF 할당 공급업체 ID여야 합니다.
| 페이지 | ID | 메모 |
|---|---|---|
| 0xD | 0x91 | 고유한 펜 식별에 의존하는 기능의 경우 필수(아래 참조) |
고유한 펜 식별에 따라 달라지는 기능
PenID 보고는 펜 햅틱(이 가이드의 햅틱 기능에 필요)과 같은 시나리오를 사용하도록 설정하는 데 필수입니다.
수동 입력에 여러 펜을 사용하는 시나리오의 경우에도 필수입니다. 예:
- Windows의 화이트보드 앱은 각 펜을 특정 수동 입력 도구에 매핑할 수 있는 여러 펜 사용량을 지원합니다.
- 일반적으로 디지타이저가 당시 화면에서 하나의 펜만 지원할 수 있음에도 불구하고 다른 물리적 펜에 특성이나 동작을 할당하려는 앱
- 지원되는 디지타이저에서 여러 개의 동시 펜을 추적하려는 앱
햅틱 출력 보고서
펜 디바이스가 햅틱 피드백을 지원하는 경우 스타일러스 TLC 내에 햅틱 피드백 컬렉션(페이지 0x0E, 사용량 0x01)을 포함하여 시스템 및 애플리케이션에서 이를 활용할 수 있습니다. HID 사양이 햅틱 피드백을 지원하는 방법에 대한 자세한 내용은 HID 사양에 대한 햅틱 페이지 비준을 참조하세요.
호스트는 출력 보고서에서 다음 사용을 사용하여(햅틱 피드백 컬렉션을 통해) 호스트가 햅틱 펜 디바이스에 햅틱 피드백 이벤트를 발행할 수 있도록 합니다. 디바이스가 햅틱 피드백 컬렉션을 노출하도록 선택한 경우 호스트 시작 햅틱 피드백이 지원되도록 허용하려면 일부 사용이 필수입니다.
| 멤버 | Description | 페이지 | ID | 필수/선택 |
|---|---|---|---|---|
| 파형 목록 | 디바이스에서 지원하는 햅틱 파형의 순서가 지정된 목록 | 0x0E | 0x10 | 필수 |
| 지속 시간 목록 | 파형 목록에 있는 파형 지속 시간의 순서가 지정된 목록 | 0x0E | 0x11 | 필수 |
| 자동 트리거 | 디바이스의 재량에 따라 자동으로 발생하는 파형 | 0x0E | 0x20 | 필수 |
| 자동 트리거 관련 제어 | 햅틱 피드백과 관련된 컨트롤의 HID 사용 | 0x0E | 0x22 | 필수 |
| 강도 | 출력 - 수동 트리거 파형의 강도(백분율) | 0x0E | 0x23 | 선택 사항 |
| 반복 횟수 | 출력 - 최초 재생 후 수동 트리거 파형을 재생할 횟수 | 0x0E | 0x24 | 선택 사항 |
| 재트리거 기간 | 출력 - 반복 시 수동 트리거 재실행 전까지의 대기 시간 | 0x0E | 0x25 | 선택 사항 |
| 파형 컷오프 시간 | 수동 트리거 파형이 차단되기 전에 재생할 수 있는 최대 시간 | 0x0E | 0x28 | 선택 사항 |
파형 목록
파형 목록 사용량은 서수를 사용하여 순서가 지정된 지원되는 파형의 HID 사용 컬렉션을 나타냅니다. 미리 정의된 햅틱 파형은 HID 사양에 정의되어 있습니다. 펜 햅틱 디바이스의 경우 이러한 파형은 서로 다른 시나리오에 해당하는 두 개의 세그먼트로 분류할 수 있습니다.
- WAVEFORM_*CONTINOUS - 사용자가 펜, 연필 등과 같은 다양한 도구로 능동적으로 수동 입력을 입력하는 동안 다양한 질감을 시뮬레이션하기 위한 수동 입력 기반 피드백.
- WAVEFORM_* - 사용자가 단추 위로 마우스를 가져가거나, 사용하지 않도록 설정된 단추를 클릭하거나 잉크 모양을 성공적으로 인식하는 것과 같은 일부 입력 기반 작업을 수행하는 경우에 대한 이산적이고 비연속적인 상호 작용 기반 피드백입니다.
펜 햅틱 디바이스에 지원되는 전체 파형 목록은 다음과 같습니다.
| 파형 | Description | 페이지 | ID | 필수/선택 |
|---|---|---|---|---|
| WAVEFORM_NONE | No-op. 진행 중인 파형의 재생 상태에 영향을 주지 않아야 합니다. | 0x0E | 0x1001 | 필수 |
| WAVEFORM_STOP | 진행 중인 파형의 재생을 중지합니다. | 0x0E | 0x1002 | 필수 |
| WAVEFORM_CLICK | 짧은 “클릭” 피드백을 만듭니다. 앱에서 선택한 상호 작용 피드백 파형이 햅틱 펜에서 지원되지 않는 경우 기본 폴백 | 0x0E | 0x1003 | 필수 |
| WAVEFORM_INKCONTINUOUS | 실제 볼펜으로 입력하는 느낌을 모방합니다. 햅틱 펜에서 수동 입력 파형을 지원하지 않는 경우 기본 폴백 | 0x0E | 0x100B | 필수 |
| WAVEFORM_SUCCESS | 사용자에게 작업이 성공했음을 알리는 강력한 햅틱 신호 | 0x0E | 0x1009 | 선택 사항 |
| WAVEFORM_ERROR | 사용자에게 작업이 실패했거나 오류가 발생했음을 알리는 강력한 햅틱 신호 | 0x0E | 0x100A | 선택 사항 |
| WAVEFORM_HOVER | 사용자가 햅틱 펜으로 대화형 UI 요소 위로 마우스를 가져갔을 때의 햅틱 신호 | 0x0E | 0x1008 | 선택 사항 |
| WAVEFORM_PRESS | 사용자가 증분 작업에서 대화형 UI 요소를 눌렀을 때의 햅틱 신호(놓음 참조) | 0x0E | 0x1006 | 선택 사항 |
| WAVEFORM_RELEASE | 사용자가 증분 작업에서 대화형 UI 요소를 놓을 때의 햅틱 신호(누름 참조) | 0x0E | 0x1007 | 선택 사항 |
| WAVEFORM_PENCILCONTINUOUS | 사용자가 연필을 수동 입력 도구로 선택할 때의 연속 햅틱 신호 | 0x0E | 0x100C | 선택 사항 |
| WAVEFORM_MARKERCONTINUOUS | 사용자가 마커를 수동 입력 도구로 선택할 때의 연속 햅틱 신호 | 0x0E | 0x100D | 선택 사항 |
| WAVEFORM_CHISELMARKERCONTINUOUS | 사용자가 각진 선 마커/형광펜을 수동 입력 도구로 선택할 때의 연속 햅틱 신호 | 0x0E | 0x100E | 선택 사항 |
| WAVEFORM_BRUSHCONTINUOUS | 사용자가 브러시를 수동 입력 도구로 선택할 때의 연속 햅틱 신호 | 0x0E | 0x100F | 선택 사항 |
| WAVEFORM_ERASERCONTINUOUS | 사용자가 지우개를 수동 입력 도구로 선택할 때의 연속 햅틱 신호 | 0x0E | 0x1010 | 선택 사항 |
| WAVEFORM_SPARKLECONTINUOUS | 다중 색 브러시와 같은 특수 잉크 도구의 연속 햅틱 신호 | 0x0E | 0x1011 | 선택 사항 |
참고
필수 사항은 아니지만 보다 완전한 사용자 환경을 제공하기 위해 열거된 다른 파형도 구현하는 것이 좋습니다. 특히 WAVEFORM_PRESS 및 WAVEFORM_RELEASE는 귀중한 상호 작용 피드백을 제공하므로 적극 권장합니다.
모든 HID 호환 햅틱 디바이스에는 WAVEFORM_NONE 및 WAVEFORM_STOP이 모두 필요합니다. 서수 1과 2는 암시적으로 WAVEFORM_NONE 및 WAVEFORM_STOP으로 설정됩니다. 파형 목록 또는 지속 시간 목록에서 선언할 필요가 없습니다. 파형 목록은 목록에 있는 각 서수의 물리적 최솟값과 최댓값으로 지원되는 파형을 선언합니다.
지속 시간 목록
지속 시간 목록 사용량은 서수를 사용하여 순서가 지정된 파형 목록에서 지원되는 파형의 지속 시간 컬렉션을 나타냅니다. 파형 지속 시간의 단위는 밀리초이며 지속 시간은 비연속 파형에 대해 0이 아닌 양수 값이어야 합니다. 파형이 연속적이면(호스트에서 중지하거나 파형 차단 시간이 초과될 때까지 재생됨) 해당 지속 시간은 0으로 정의됩니다.
WAVEFORM_NONE 및 WAVEFORM_STOP은 지속 시간이 0인 것으로 가정합니다. 지속 시간 목록에 선언할 필요는 없습니다.
강도
강도 사용량은 파형에 적용할 최대 강도의 백분율을 나타냅니다. 이 값은 0%에서 100% 사이여야 합니다. 100%는 파형이 최대 강도에서 디바이스에 의해 트리거됨을 나타내고 0%는 햅틱 변환기가 사용하도록 설정되지 않았음을 나타냅니다.
반복 횟수
반복 횟수 사용량은 파형을 반복하는 횟수를 나타냅니다. 반복 횟수가 0이면 수동 트리거 파형이 한 번만 재생되어야 함을 나타냅니다(반복 없음). 파형 컷오프 시간이 초과된 경우 불완전한 반복은 무시됩니다.
재트리거 기간
재트리거 기간 사용량은 반복 카운트에 지정된 값에 따라 출력 보고서에서 수동 트리거 파형을 반복하기 전에 디바이스가 대기하는 시간을 나타냅니다. 이 값의 단위는 밀리초입니다. 재트리거 주기가 재생 중인 파형의 지속 시간보다 짧으면 재트리거 주기로 표시된 시간 주기에 파형을 중지했다가 다시 시작해야 합니다.
파형 컷오프 시간
파형 차단 시간 사용량은 재생을 종료하기 전에 디바이스에서 수동 트리거 파형이 반복되도록 허용하는 최대 시간을 나타냅니다. 이는 디바이스에 대한 상수 값이며 설정 지속 시간이 없는 연속 파형과 여러 번 반복하도록 설정된 불연속 지속 시간이 있는 파형을 모두 포함합니다. 이 값의 단위는 밀리초입니다.
햅틱 출력 보고서
호스트는 출력 보고서에서 다음 사용을 통해 햅틱 펜 디바이스에 햅틱 피드백 이벤트를 발행합니다. 일부 사용은 Windows 호스트 구현과의 호환성을 위해 필수입니다.
| 멤버 | Description | 페이지 | ID | 필수/선택 |
|---|---|---|---|---|
| 수동 트리거 | 호스트에서 명시적 명령으로 실행할 파형 | 0x0E | 0x21 | 필수 |
| 강도 | 백분율로 나타낸 수동 트리거 파형의 강도 | 0x0E | 0x23 | 필수 |
| 반복 횟수 | 최초 재생 후 수동 트리거 파형 재생 횟수 | 0x0E | 0x24 | 선택 사항 |
| 재트리거 기간 | 반복 시 수동 트리거 재트리거 전까지의 대기 시간 | 0x0E | 0x25 | 선택 사항 |
수동 트리거
수동 트리거 사용량은 호스트에서 재생하도록 요청한 파형 목록에서 지원되는 파형 사용량을 나타냅니다. WAVEFORM_NONE 이외의 수동 트리거가 포함된 출력 보고서가 디바이스로 전송되면 출력 보고서에 포함된 추가 속성(강도, 반복 횟수, 재트리거 기간)으로 지정된 파형 재생을 즉시 시작해야 합니다. 출력 보고서에 WAVEFORM_STOP의 수동 트리거가 포함된 경우 진행 중인 파형 재생을 중지해야 합니다.
강도, 반복 횟수, 재트리거 기간 사용에 대해서는 출력 기능 보고서에 대한 이전 섹션을 참조하세요.
햅틱 시작 및 중지
아래 순서도는 펜 햅틱 신호가 구성, 삭제, 시작, 중지되어야 하는 시기를 설명합니다.
아래에 설명된 다양한 햅틱 상태는 다음과 같습니다.
- 재생: 펜이 햅틱 파형을 활발하게 재생하고 있습니다.
- 일시 중지됨: 펜이 파형으로 구성되어 있지만 활발하게 재생하지는 않습니다.
- 중지됨: 펜이 파형으로 구성되어 있지 않으며 아무 것도 활발하게 재생하지 않습니다.
디지타이저에 대한 펜 상태는 Windows 펜 상태를 참조하세요.
참고
펜이 범위를 벗어나면 햅틱 구성을 지우는 것이 권장되지만 필수는 아닙니다. 이는 펜이 범위를 벗어날 때 "펜: 범위 내; 햅틱: 일시 중지됨" 상태에서 나오는 두 개의 대체 경로에 의해 아래 다이어그램에서 전달됩니다.
참고
호스트는 언제든지 비연속 파형 재생을 요청할 수 있습니다. 이 경우 펜은 일단 재생한 다음 이전 상태로 돌아가야 합니다.
참고
호스트는 연속 파형만 구성해야 합니다. 불연속/비연속 파형은 수동으로만 트리거되어야 합니다.

키보드 컬렉션(선택 사항)
HID 키보드 보고서를 통해 호스트에 끝부분의 단추 클릭을 보고할 수 있는 선택적 기능입니다.
호환 디바이스는 호스트에 노출된 HID Bluetooth 키보드 디바이스를 통해 3개의 고유한 단추 동작에 해당하는 3개의 고유한 키보드 조합을 보고해야 합니다. 작업 및 해당 키보드 조합은 다음과 같습니다.
| 단추 동작 | 키 조합 |
|---|---|
| 한 번 클릭 | WIN+F20 |
| 두 번 클릭 | WIN+F19 |
| 길게 누르기 | Win+F18 |
Bluetooth 단추 구현
끝부분의 Bluetooth 단추를 구현하기 위해 디바이스는 호스트에 노출된 HID Bluetooth LE 키보드 디바이스를 통해 3개의 고유한 단추 동작에 해당하는 3개의 고유한 키보드 조합을 보고합니다. 작업 및 해당 키보드 조합은 다음과 같습니다.
| Bluetooth 단추 동작 | 보고할 키 조합 |
|---|---|
| 한 번 클릭 동작의 결과 | WIN+F20 |
| 두 번 클릭 | WIN+F19 |
| 길게 누르기 | WIN+F18 |
펜 보관
Windows 10 버전 1903부터 Windows는 호환되는 펜 보관함이 통합된 디바이스에 대한 알림을 지원합니다. 이 메커니즘은 펜이 제거되거나 교체되는 것을 검색하고 한 쌍의 바로 가기 조합에 대한 해당 HID 키보드 보고서를 생성하는 하드웨어에 의존합니다. 도킹(보관 시 펜 교체) 신호를 보내려면 WIN+CTRL+F20을 보고하고 도킹 해제(보관에서 펜이 제거됨) 신호를 보내려면 WIN+CTRL+F19를 보고합니다. 이는 펌웨어 또는 드라이버로 구현할 수 있습니다.
이러한 도킹 해제/도킹 이벤트는 셸 잉크 작업 영역 메뉴를 불러오거나 닫습니다. Windows 10부터 버전 2004 Office는 모든 개발자가 보관 이벤트를 인식하도록 애플리케이션을 확장할 수 있도록 하는 플랫폼 API를 사용하여 이러한 이벤트에 반응합니다. 펜이 도크에 있는지 여부를 쿼리하는 것은 지원되지 않으며 앱은 포그라운드에 있는 경우 제거 및 반환 이벤트에 대해서만 알림을 받습니다.
샘플 HID 보고서 설명자
05,0D, // Usage Page (Digitizers)
09,20, // Usage (Stylus)
A1,01, // Collection (Application)
85,40, // Report ID (64)
95,01, // Report Count (1)
75,20, // Report Size (32)
17,00,00,00,80, // Logical Minimum (-2147483648)
27,FF,FF,FF,7F, // Logical Maximum (2147483647)
09,5B, // Transducer Serial Number
B1,03, // Feature (Cnst,Var,Abs)
75,10, // Report Size (16)
15,01, // Logical Minimum (1)
27,FF,FF,00,00, // Logical Maximum (65535)
09,91, // Transducer Vendor ID
B1,03, // Feature (Cnst,Var,Abs)
05,0E, // Usage Page (Haptics)
09,01, // Usage (0x01)
A1,02, // Collection (Logical)
85,41, // Report ID (65)
95,01, // Report Count (1)
75,08, // Report Size (8)
15,01, // Logical Minimum (1)
26,FF,00, // Logical Maximum (255)
09,24, // Usage (0x24)
B1,02, // Feature (Data,Var,Abs)
09,24, // Usage (0x24)
91,02, // Output (Data,Var,Abs)
09,23, // Usage (0x23)
B1,02, // Feature (Data,Var,Abs)
09,23, // Usage (0x23)
91,02, // Output (Data,Var,Abs)
15,01, // Logical Minimum (1)
25,12, // Logical Maximum (18)
09,20, // Usage (0x20)
B1,02, // Feature (Data,Var,Abs)
09,21, // Usage (0x21)
91,02, // Output (Data,Var,Abs)
15,00, // Logical Minimum (0)
26,FE,00, // Logical Maximum (254)
66,01,10, // Unit (SI Linear)
55,FD, // Unit Exponent (253)
35,00, // Physical Minimum (0)
46,EC,09, // Physical Maximum (2540)
09,28, // Usage (0x28)
91,02, // Output (Data,Var,Abs)
75,10, // Report Size (16)
26,D0,07, // Logical Maximum (2000)
46,D0,07, // Physical Maximum (2000)
09,25, // Usage (0x25)
91,02, // Output (Data,Var,Abs)
09,25, // Usage (0x25)
B1,02, // Feature (Data,Var,Abs)
45,00, // Physical Maximum (0)
85,42, // Report ID (66)
75,20, // Report Size (32)
17,42,00,0D,00, // Logical Minimum (852034)
27,42,00,0D,00, // Logical Maximum (852034)
09,22, // Usage (0x22)
B1,02, // Feature (Data,Var,Abs)
09,11, // Usage (0x11)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
75,10, // Report Size (16)
95,10, // Report Count (16)
15,01, // Logical Minimum (1)
27,FF,FF,00,00, // Logical Maximum (65535)
19,03, // Usage Minimum (0x03)
29,12, // Usage Maximum (0x12)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
05,0E, // Usage Page (Haptics)
09,10, // Usage (0x10)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
16,03,10, // Logical Minimum (4099)
26,FF,2F, // Logical Maximum (12287)
19,03, // Usage Minimum (0x03)
29,12, // Usage Maximum (0x12)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
C0, // End Collection ()
C0 // End Collection ()