펜 햅틱(촉각) 피드백

펜 디바이스에서 촉각 피드백을 사용하여 Windows 앱 SDK 앱에서 보다 자연스럽고 촉각적인 상호 작용을 제공하는 방법을 알아봅니다.

Windows 11 디지털 펜에 대한 촉각 피드백을 도입하여 사용자가 펜이 앱의 UI와 상호 작용하는 것을 느낄 수 있도록 했습니다. 이 기능을 지칭할 때 햅틱은 개발자 API 및 문서에서 사용되며, 반면 촉각은 Windows 설정에 표시되는 사용자용 명칭입니다.

주요 API

촉각 피드백 유형

다음 두 가지 유형의 촉각 피드백을 사용할 수 있습니다.

  • 수동 입력 피드백 - 펜이 화면에 닿는 동안 연속 진동을 통해 필기 또는 그리기 도구(펜, 마커, 연필, 형광펜)의 느낌을 시뮬레이션합니다.
  • 상호 작용 피드백 - 단추 위로 마우스를 가져가거나, 클릭하거나, 완료된 작업을 확인하는 등의 사용자 작업에 대한 짧은 촉각 신호입니다.

펜 입력 감지

이벤트에 등록 PointerEntered 하고 포인터 디바이스 유형이 펜인지 확인합니다.

private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
    {
        return;
    }

    // Pen detected — check for haptic support.
}

Windows 앱 SDK에서 PenDevice 가져오기

Windows 앱 SDK 앱에서 Windows 앱 SDK interop 클래스를 사용하여 PenDeviceInterop 포인터 지점에서 WinRT PenDevice 개체를 가져옵니다. PenDevice, SimpleHapticsController, 및 KnownSimpleHapticsControllerWaveforms는 Windows.Devices.Input 및 Windows.Devices.Haptics 네임스페이스의 WinRT 형식이며, interop 호출 자체만 Windows 앱 SDK의 Microsoft.UI.Input.Interop 네임스페이스에서 제공됩니다.

using Microsoft.UI.Input.Interop;
using Windows.Devices.Haptics;
using Windows.Devices.Input;
using Windows.Foundation.Metadata;

private void InputObserver_PointerEntered(object sender, PointerRoutedEventArgs e)
{
    if (e.Pointer.PointerDeviceType != Microsoft.UI.Input.PointerDeviceType.Pen)
    {
        return;
    }

    var penDevice = PenDeviceInterop.FromPointerPoint(e.GetCurrentPoint(null));

    if (penDevice == null)
    {
        return; // Pen does not support advanced features.
    }

    // SimpleHapticsController requires Windows 11. Check for API presence
    // before accessing it so the app doesn't throw on Windows 10.
    if (!ApiInformation.IsPropertyPresent(
        "Windows.Devices.Input.PenDevice", "SimpleHapticsController"))
    {
        return; // Haptic feedback requires Windows 11.
    }

    var hapticsController = penDevice.SimpleHapticsController;
    if (hapticsController == null)
    {
        return; // Pen does not support haptic feedback.
    }

    // Configure haptic feedback (see examples below).
}

비고

UWP 앱에서 대신 사용합니다 PenDevice.GetFromPointerId . 클래스는 PenDeviceInterop Windows 앱 SDK 관련되어 있습니다.

잉킹 파형

펜이 화면에 닿아 있는 동안 잉크 파형이 계속 표시됩니다. 필요한 파형은 모든 햅틱 펜에서 지원이 보장됩니다.

파형 Description 필수
InkContinuous 기본 볼펜 느낌. 지원되지 않는 파형에 대한 대체입니다. Yes
연속 브러시 브러시 도구 No
PencilContinuous 연필 도구 No
MarkerContinuous 마커 도구 No
ChiselMarkerContinuous 쐐기형 마커/형광펜 No
연속 지우개 지우개 도구 No
GalaxyPenContinuous 특수 잉크(여러 색 브러시) No

상호 작용 파형

상호 작용 파형은 UI 작업에 대한 짧고 직접적인 피드백을 제공합니다.

파형 Description 필수
클릭 기본 짧은 클릭입니다. 지원되지 않는 상호 작용에 대한 대체입니다. Yes
오류 작업이 실패했거나 오류가 발생했습니다. No
호버 대화형 요소 위로 마우스를 가리키기 시작했습니다. No
눌러주세요 대화형 요소를 눌렀습니다. No
Release 대화형 요소 릴리스됨 No
Success 작업 성공 No
BuzzContinuous 연속 윙윙 거리는 소리 No
연속 진동 지속적인 우르릉거림 No

촉각 피드백 보내기

반복하여 원하는 파형을 찾은 다음, 다음을 호출SupportedFeedback합니다.SendHapticFeedback

SimpleHapticsControllerFeedback currentWaveform = null;

// Try to use BrushContinuous, fall back to InkContinuous.
foreach (var waveform in hapticsController.SupportedFeedback)
{
    if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.BrushContinuous)
    {
        currentWaveform = waveform;
        break;
    }
}

if (currentWaveform == null)
{
    foreach (var waveform in hapticsController.SupportedFeedback)
    {
        if (waveform.Waveform == KnownSimpleHapticsControllerWaveforms.InkContinuous)
        {
            currentWaveform = waveform;
            break;
        }
    }
}

if (currentWaveform != null)
{
    hapticsController.SendHapticFeedback(currentWaveform);
}

촉각 피드백 중지

포인터가 요소를 종료할 때 항상 촉각 피드백을 중지합니다. 동일한 요소에 PointerExited을(를) 등록합니다.

private void Canvas_PointerExited(object sender, PointerRoutedEventArgs e)
{
    hapticsController?.StopFeedback();
}

비고

일부 펜은 펜이 화면을 떠날 때 자동으로 촉각을 중지합니다. 그러나 모든 펜이 이 작업을 수행하는 것은 아니므로 항상 명시적으로 호출 StopFeedback 합니다.

촉각 피드백 사용자 지정

일부 펜은 추가 사용자 지정을 지원합니다. 사용하기 전에 지원 여부를 확인하세요.

재산 다음을 사용하여 지원 확인
강도 IsIntensitySupported
재생 수 IsPlayCountSupported
재생 기간 IsPlayDurationSupported
재생 일시 중지 간격 IsReplayPauseIntervalSupported
if (hapticsController.IsIntensitySupported)
{
    hapticsController.SendHapticFeedback(currentWaveform, 0.75); // 75% intensity
}