다음을 통해 공유


WM_POINTERUP 메시지

창의 클라이언트 영역에 접촉하는 포인터가 접촉이 끊어질 때 게시됩니다. 이 입력 메시지는 포인터가 접촉하는 창을 대상으로 하고 포인터는 해당 시점에서 창에 암시적으로 캡처되므로 창의 접촉이 끊어질 때까지 포인터에 대한 WM_POINTERUP 알림을 포함한 입력 메시지를 계속 받습니다.

창은 WindowProc 함수를 통해 이 메시지를 받습니다.

![중요]
데스크톱 앱은 DPI를 인식해야 합니다. 앱이 DPI를 인식하지 못하는 경우 DPI 가상화로 인해 포인터 메시지 및 관련 구조에 포함된 화면 좌표가 부정확해 보일 수도 있습니다. DPI 가상화는 DPI를 인식하지 않고 기본적으로 활성 상태인 응용 프로그램에 대한 자동 크기 조정 지원을 제공합니다(사용자가 해제할 수 있음). 자세한 내용은 High-DPI Win32 응용 프로그램 쓰기를 참조하세요.

#define WM_POINTERUP                  0x0247

매개 변수

wParam

포인터에 대한 정보를 포함합니다. 다음 매크로를 사용하여 wParam 매개 변수에서 정보를 검색합니다.

  • GET_POINTERID_WPARAM(wParam): 포인터 식별자입니다.

  • IS_POINTER_NEW_WPARAM(wParam): 이 메시지가 새 포인터에 의해 생성된 첫 번째 입력을 나타내는지 여부를 나타내는 플래그입니다.

  • IS_POINTER_INRANGE_WPARAM(wParam): 이 메시지가 수명 동안 포인터에 의해 생성되었는지 여부를 나타내는 플래그입니다. 이 플래그는 포인터가 검색 범위를 떠났다는 것을 나타내는 메시지에 설정되지 않습니다.

  • IS_POINTER_INCONTACT_WPARAM(wParam): 창 화면과 접촉하는 포인터에 의해 이 메시지가 생성되었는지 여부를 나타내는 플래그입니다. 이 플래그는 커서 올리기 포인터를 나타내는 메시지에 설정되지 않습니다.

  • IS_POINTER_PRIMARY_WPARAM(wParam): 이 포인터가 기본 포인터로 지정되었음을 나타냅니다.

  • IS_POINTER_FIRSTBUTTON_WPARAM(wParam): 기본 작업이 있는지 여부를 나타내는 플래그입니다.

    • 이는 마우스 왼쪽 단추 아래쪽과 유사합니다.
    • 터치 포인터가 디지타이저 표면과 접촉할 때 이 집합이 나타납니다.
    • 펜 포인터가 단추를 누르지 않고 디지타이저 표면과 접촉할 때 이 집합이 나타납니다.
  • IS_POINTER_SECONDBUTTON_WPARAM(wParam): 보조 작업이 있는지 여부를 나타내는 플래그입니다.

    • 이는 마우스 오른쪽 단추 아래쪽과 유사합니다.
    • 펜 포인터가 펜 배럴 단추를 눌렀을 때 디지타이저 표면과 접촉하면 이 집합이 나타납니다.
  • IS_POINTER_THIRDBUTTON_WPARAM(wParam): 포인터 형식에 따라 3차 작업이 하나 이상 있는지 여부를 나타내는 플래그입니다. 3차 작업에 응답하려는 응용 프로그램은 포인터 유형과 관련된 정보를 검색하여 어떤 3차 단추를 누를지 결정해야 합니다. 예를 들면 응용 프로그램이 GetPointerPenInfo를 호출하고 단추 상태를 지정하는 플래그를 검사하여 펜의 단추 상태를 확인할 수 있습니다.

  • IS_POINTER_FOURTHBUTTON_WPARAM(wParam): 지정된 포인터가 네 번째 작업을 수행했는지 여부를 나타내는 플래그입니다. 네 번째 작업에 응답하려는 응용 프로그램은 포인터 유형과 관련된 정보를 검색하여 첫 번째 확장 마우스(XButton1) 단추를 눌렀는지 확인해야 합니다.

  • IS_POINTER_FIFTHBUTTON_WPARAM(wParam): 지정된 포인터가 다섯 번째 작업을 수행했는지 여부를 나타내는 플래그입니다. 다섯 번째 작업에 응답하려는 응용 프로그램은 포인터 유형과 관련된 정보를 검색하여 두 번째 확장 마우스(XButton2) 단추를 눌렀는지 확인해야 합니다.

    자세한 내용은 포인터 플래그를 참조하세요.

    참고 항목

    커서 올리기 포인터에는 단추 플래그가 설정되지 않습니다. 이는 마우스 단추가 없는 마우스 이동과 유사합니다. 예를 들면 응용 프로그램이 GetPointerPenInfo를 호출하고 단추 상태를 지정하는 플래그를 검사하여 커서 올리기 펜의 단추 상태를 확인할 수 있습니다.

lParam

포인터의 점 위치를 포함합니다.

참고 항목

포인터가 사소한 영역을 통해 디바이스와 접촉할 수 있으므로 이 지점 위치는 더 복잡한 포인터 영역의 단순화일 수 있습니다. 가능하면 응용 프로그램은 지점 위치 대신 전체 포인터 영역 정보를 사용해야 합니다.

다음 매크로를 사용하여 점의 실제 화면 좌표를 검색합니다.

반환 값

애플리케이션이 이 메시지를 처리하면 0을 반환해야 합니다.

응용 프로그램이 이 메시지를 처리하지 않는 경우 DefWindowProc를 호출해야 합니다.

설명

![중요]
창이 포인터 캡처를 잃고 WM_POINTERCAPTURECHANGED 알림을 받으면 일반적으로 추가 알림을 받지 않습니다. 이러한 이유로 균등하게 쌍을 이루는 WM_POINTERDOWN/WM_POINTERUP 또는 WM_POINTERENTER/WM_POINTERLEAVE 알림을 기반으로 가정을 하지 않는 것이 중요합니다.

각 포인터에는 수명 동안 고유한 포인터 식별자가 있습니다. 포인터의 수명은 처음 검색될 때 시작됩니다.

커서 올리기 포인터가 검색되면 WM_POINTERENTER 메시지가 생성됩니다. 커서 올리기가 안 되는 포인터가 검색되면 WM_POINTERDOWN 메시지와 WM_POINTERENTER 메시지가 연이어 생성됩니다.

수명 중에 포인터로 마우스를 올리거나 접촉하는 동안 일련의 WM_POINTERUPDATE 메시지를 생성할 수 있습니다.

포인터의 수명은 더 이상 검색되지 않을 때 종료됩니다. 그러면 WM_POINTERLEAVE 메시지가 생성됩니다.

포인터가 중단되면 POINTER_FLAG_CANCELED가 설정됩니다.

캡처되지 않은 포인터가 창의 범위 밖으로 이동할 때 WM_POINTERLEAVE 메시지가 생성될 수도 있습니다.

포인터의 가로 및 세로 위치를 가져올 때에는 다음을 이용합니다.

다음 코드를 사용하여 가로 및 세로 위치를 가져옵니다.

xPos = GET_X_LPARAM(lParam); 
yPos = GET_Y_LPARAM(lParam);

MAKEPOINTS 매크로를 사용하여 lParam 매개 변수를 POINTS 구조체로 변환할 수도 있습니다.

GetKeyState 함수를 사용하여 이 메시지와 연결된 키보드 한정자 키 상태를 확인할 수 있습니다. 예를 들어 ALT 키를 눌렀는지 감지하려면 GetKeyState(VK_MENU)가 0인지 <.

응용 프로그램이 이 메시지를 처리하지 않고 이 포인터 또는 다른 포인터의 입력 시퀀스가 제스처로 인식되면 DefWindowProcWM_GESTURE 메시지를 하나 이상 생성할 수도 있습니다. 제스처가 인식되지 않으면 DefWindowProc에서 마우스 입력을 생성할 수 있습니다.

응용 프로그램에서 일부 포인터 입력을 선택적으로 사용하고 나머지를 DefWindowProc에 전달하는 경우 결과 동작은 정의되지 않습니다.

GetPointerInfo 함수를 사용하여 이 메시지와 관련된 추가 정보를 검색합니다.

예제

다음 코드 예제는 이 메시지와 연결 된 포인터의 x 및 y 위치를 검색 하는 방법을 나타낸 것입니다.

int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);

// process pointer up, similar to mouse button up

다음 코드 예제는 이 메시지와 연결 된 포인터 ID를 가져오는 방법을 나타낸 것입니다.

POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);

// Retrieve common pointer information
if (!GetPointerInfo(pointerId, &pointerInfo))
{
    
// failure, call GetLastError()
}
else
{
    // success, process pointerInfo
}


다음 코드 예제는 이 메시지와 연결 된 다른 포인터 형식을 처리 하는 방법을 나타낸 것입니다.

POINTER_TOUCH_INFO   touchInfo;
POINTER_PEN_INFO     penInfo;
POINTER_INFO pointerInfo;
UINT32       pointerId = GET_POINTERID_WPARAM(wParam);
POINTER_TYPE pointerType = PT_POINTER;

// default to unhandled to enable call to DefWindowProc
fHandled = FALSE;

if (!GetPointerType(pointerId, &pointerType))
{
    // failure, call GetLastError()
    // set PT_POINTER to fall to default case below
    pointerType = PT_POINTER;
}

switch (pointerType)
{
case PT_TOUCH:
    // Retrieve touch information
    if (!GetPointerTouchInfo(pointerId, &touchInfo))
    {
        // failure, call GetLastError()
    }
    else
    {
        // success, process touchInfo
        // mark as handled to skip call to DefWindowProc
        fHandled = TRUE;
    }
    break;
case PT_PEN:
    // Retrieve pen information
    if (!GetPointerPenInfo(pointerId, &penInfo))
    {
        // failure, call GetLastError()
    }
    else
    {
        // success, process penInfo
        // mark as handled to skip call to DefWindowProc
        fHandled = TRUE;
    }
    break;
default:
    if (!GetPointerInfo(pointerId, &pointerInfo)) 
    {
        // failure.
    } 
    else 
    {
        // success, proceed with pointerInfo.
        fHandled = HandleGenericPointerMessage(&pointerInfo);
    }
    break;
}

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows 8 [데스크톱 앱만 해당]
지원되는 최소 서버
Windows Server 2012 [데스크톱 앱만 해당]
헤더
Winuser.h(Windows.h 포함)

참고 항목

메시지

참조

포인터 플래그

GET_POINTERID_WPARAM

IS_POINTER_NEW_WPARAM

IS_POINTER_INRANGE_WPARAM

IS_POINTER_INCONTACT_WPARAM

IS_POINTER_PRIMARY_WPARAM

IS_POINTER_FIRSTBUTTON_WPARAM

IS_POINTER_SECONDBUTTON_WPARAM

IS_POINTER_THIRDBUTTON_WPARAM

IS_POINTER_FOURTHBUTTON_WPARAM

IS_POINTER_FIFTHBUTTON_WPARAM