WM_POINTERDOWN メッセージ
ポインターがウィンドウのクライアント領域に接触したときに投稿されます。 この入力メッセージは、ポインターが接触するウィンドウを対象とし、ポインターがウィンドウに暗黙的にキャプチャされ、ウィンドウが接触を中断するまでポインターの入力を受け取り続けます。
ウィンドウは、WindowProc 関数を介してこのメッセージを受け取ります。
![重要]
デスクトップ アプリは DPI 対応である必要があります。 アプリが DPI に対応していない場合、DPI 仮想化のためにポインター メッセージと関連する構造に含まれる画面座標が不正確に見える可能性があります。 DPI 仮想化は、DPI 対応ではなく、既定でアクティブになっているアプリケーションに対して自動スケーリングのサポートを提供します (ユーザーは無効にすることができます)。 詳細については、「 高 DPI Win32 アプリケーションの作成」を参照してください。
#define WM_POINTERDOWN 0x0246
パラメーター
-
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): ポインターの種類に基づいて 1 つ以上の三次アクションがあるかどうかを示すフラグ。3 次アクションに応答するアプリケーションでは、ポインターの種類に固有の情報を取得して、どの 3 番目のボタンが押されているかを判断する必要があります。 たとえば、アプリケーションでは 、GetPointerPenInfo を呼び出し、ボタンの状態を指定するフラグを調べることで、ペンのボタンの状態を確認できます。
IS_POINTER_FOURTHBUTTON_WPARAM(wParam): 指定したポインターが 4 番目のアクションを実行したかどうかを示すフラグ。 4 番目のアクションに応答するアプリケーションでは、ポインターの種類に固有の情報を取得して、最初の拡張マウス (XButton1) ボタンが押されているかどうかを判断する必要があります。
IS_POINTER_FIFTHBUTTON_WPARAM(wParam): 指定したポインターが 5 番目のアクションを実行したかどうかを示す フラグ 。 5 番目のアクションに応答するアプリケーションでは、ポインターの種類に固有の情報を取得して、2 番目の拡張マウス (XButton2) ボタンが押されているかどうかを判断する必要があります。
詳細については、「 ポインター フラグ 」を参照してください。
Note
ホバー ポインターには、ボタン フラグが設定されていません。 これは、マウス ボタンを下に移動しないマウスの移動に似ています。 アプリケーションでは、たとえば 、GetPointerPenInfo を呼び出してボタンの状態を指定するフラグを調べることで、ホバーペンのボタンの状態を確認できます。
-
lParam
-
ポインターのポイント位置を格納します。
Note
ポインターが単純でない領域を介してデバイスと接触する可能性があるため、このポイントの場所は、より複雑なポインター領域の簡略化になる可能性があります。 可能な限り、アプリケーションではポイントの場所ではなく、完全なポインター領域情報を使用する必要があります。
ポイントの物理的な画面座標を取得するには、次のマクロを使用します。
- GET_X_LPARAM(lParam): x (水平点) 座標。
- GET_Y_LPARAM(lParam): y (垂直点) 座標。
戻り値
アプリケーションでこのメッセージを処理する場合は、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);
lParam パラメーターを POINTS) 構造体に変換するには、 MAKEPOINTS マクロを使用します。
メッセージに関連付けられている詳細情報を取得するには、 GetPointerInfo 関数を使用します。
このメッセージに関連付けられているキーボード修飾子キーの状態を確認するには、 GetKeyState 関数を使用します。 たとえば、Alt キーが押されたことを検出するには、GetKeyState(VK_MENU) < 0 かどうかをチェックします。
アプリケーションがこのメッセージを処理しない場合、 DefWindowProc は、このからの入力シーケンスと、場合によっては他のポインターがジェスチャとして認識された場合に、1 つ以上の WM_GESTURE メッセージを生成する可能性があることに注意してください。 ジェスチャが認識されない場合、 DefWindowProc はマウス入力を生成する可能性があります。
アプリケーションがポインター入力を選択的に使用し、残りを DefWindowProc に渡すと、結果の動作は未定義になります。
ウィンドウがポインターのキャプチャを失い、 WM_POINTERCAPTURECHANGED 通知を受信すると、通常、それ以上の通知は受信されません。 したがって、ウィンドウは、DOWN/UP/ENTER/LEAVE 通知を均等にペアにするかどうかに関係なく、そのポインターの状態を想定しないことが重要です。
例
次のコード例は、 IS_POINTER_FIRSTBUTTON_WPARAM、 GET_X_LPARAM、GET_Y_LPARAM、 IS_POINTER_SECONDBUTTON_WPARAMを使用して、 WM_POINTERDOWNメッセージに 関連付けられている関連情報を取得する方法を示しています。
int xPos = GET_X_LPARAM(lParam);
int yPos = GET_Y_LPARAM(lParam);
if (IS_POINTER_PRIMARYBUTTON_WPARAM(wParam))
{
// process pointer down, similar to mouse left button down
}
else if (IS_POINTER_SECONDARYBUTTON_WPARAM(wParam))
{
// process pointer down, similar to mouse right button down
}
次のコード例は、GET_POINTERID_WPARAMを使用して 、WM_POINTERDOWNメッセージから ポインター 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 [デスクトップ アプリのみ] |
Header |
|
関連項目
-
参照
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示