次の方法で共有


GetMouseMovePointsEx 関数 (winuser.h)

マウスまたはペンの最大 64 個の以前の座標の履歴を取得します。

構文

int GetMouseMovePointsEx(
  [in]  UINT             cbSize,
  [in]  LPMOUSEMOVEPOINT lppt,
  [out] LPMOUSEMOVEPOINT lpptBuf,
  [in]  int              nBufPoints,
  [in]  DWORD            resolution
);

パラメーター

[in] cbSize

型: UINT

MOUSEMOVEPOINT 構造体のサイズ (バイト単位)。

[in] lppt

種類: LPMOUSEMOVEPOINT

有効なマウス座標 (画面座標内) を含む MOUSEMOVEPOINT 構造体へのポインター。 タイム スタンプを含めることもできます。

GetMouseMovePointsEx 関数は、マウス座標履歴内のポイントを検索します。 関数は、ポイントを見つけた場合、指定されたポイントを含む前の最後 の nBufPoints を返します。

アプリケーションでタイム スタンプが提供されている場合、 GetMouseMovePointsEx 関数はそれを使用して、異なる時刻に記録された 2 つの等しいポイントを区別します。

アプリケーションでは、 WM_MOUSEMOVE メッセージから受信したマウス座標を使用してこの関数を呼び出し、それらを画面座標に変換する必要があります。

[out] lpptBuf

種類: LPMOUSEMOVEPOINT

ポイントを受け取るバッファーへのポインター。 サイズは 少なくとも cbSize* nBufPoints である必要があります。

[in] nBufPoints

型: int

取得するポイントの数。

[in] resolution

型: DWORD

必要な解像度。 このパラメーターには、次の値のいずれかを指定できます。

意味
GMMP_USE_DISPLAY_POINTS
1
表示解像度を使用してポイントを取得します。
GMMP_USE_HIGH_RESOLUTION_POINTS
2
高解像度ポイントを取得します。 ポイントの範囲は、x 座標と y 座標の両方で 0 から 65,535 (0xFFFF) です。 これは、描画タブレットなどの絶対座標ポインティング デバイスによって提供される解像度です。

戻り値

型: int

関数が成功した場合、戻り値はバッファー内のポイント数です。 それ以外の場合、関数は –1 を返します。 拡張エラー情報については、アプリケーションで GetLastError を呼び出すことができます。

注釈

システムは、最後の 64 個のマウス座標とそのタイム スタンプを保持します。 アプリケーションが GetMouseMovePointsEx にマウス座標を指定し、その座標がシステムのマウス座標履歴に存在する場合、関数はシステムの履歴から指定した数の座標を取得します。 また、履歴内の同じポイントを区別するために使用されるタイム スタンプを指定することもできます。

GetMouseMovePointsEx 関数は、呼び出し元のスレッドだけでなく、他のスレッドにも最終的にディスパッチされたポイントを返します。

GetMouseMovePointsEx は、次の場合に失敗するか、エラー値を返す可能性があります。

  • MOUSEMOVEPOINT 構造体に負の座標が渡される場合。
  • GetMouseMovePointsEx が負の値を持つ座標を取得する場合。
このような状況は、複数のモニターが存在する場合に発生する可能性があります。 これを修正するには、まず GetSystemMetrics を 呼び出して、次の値を取得します。
  • SM_XVIRTUALSCREEN、
  • SM_YVIRTUALSCREEN、
  • SM_CXVIRTUALSCREEN、および
  • SM_CYVIRTUALSCREEN。
次に、 GetMouseMovePointsEx から返される各ポイントについて、次の変換を実行します。
int nVirtualWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN) ;
int nVirtualHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN) ;
int nVirtualLeft = GetSystemMetrics(SM_XVIRTUALSCREEN) ;
int nVirtualTop = GetSystemMetrics(SM_YVIRTUALSCREEN) ;
int cpt = 0 ;
int mode = GMMP_USE_DISPLAY_POINTS ;

MOUSEMOVEPOINT mp_in ;
MOUSEMOVEPOINT mp_out[64] ;

ZeroMemory(&mp_in, sizeof(mp_in)) ;
mp_in.x = pt.x & 0x0000FFFF ;//Ensure that this number will pass through.
mp_in.y = pt.y & 0x0000FFFF ;
cpt = GetMouseMovePointsEx(&mp_in, &mp_out, 64, mode) ;

for (int i = 0; i < cpt; i++)
{
   switch(mode)
   {
   case GMMP_USE_DISPLAY_POINTS:
      if (mp_out[i].x > 32767)
         mp_out[i].x -= 65536 ;
      if (mp_out[i].y > 32767)
         mp_out[i].y -= 65536 ;
      break ;
   case GMMP_USE_HIGH_RESOLUTION_POINTS:
      mp_out[i].x = ((mp_out[i].x * (nVirtualWidth - 1)) - (nVirtualLeft * 65536)) / nVirtualWidth ;
      mp_out[i].y = ((mp_out[i].y * (nVirtualHeight - 1)) - (nVirtualTop * 65536)) / nVirtualHeight ;
      break ;
   }
} 

要件

要件
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー winuser.h (Windows.h を含む)
Library User32.lib
[DLL] User32.dll

関連項目

概念

MOUSEMOVEPOINT

マウス入力

参照