// コールバック関数のプロトタイプ
typedef BOOL (CALLBACK *LPCALLBACK_MOVEMOUSE)(LONG x,LONG y,LPVOID parm);
//-----------------------------------------------------------------------------
// マウス移動
//-----------------------------------------------------------------------------
// BOOL MoveMouse(
// LONG x, // 移動位置X
// LONG y, // 移動位置Y
// LONG pps, // 移動速度(毎秒ピクセル数)
// LPCALLBACK_MOVEMOUSE cb, // コールバック関数のポインタ
// LPVOID parm // コールバック関数のパラメータ
// );
//
// コールバック関数へは、座標(x,y)と任意のパラメータ(parm)が渡される。
// 関数の返値がFALSEのときこの関数は強制終了し、返値はFALSEとなる。
//-----------------------------------------------------------------------------
BOOL MoveMouse(LONG x,LONG y,LONG pps,LPCALLBACK_MOVEMOUSE cb,LPVOID parm)
{
POINT point;
LONG xx,yy,mov,movtimes,timorg,timwrk,mx,my;
// 現在の位置を取得し、各軸の移動距離と斜め移動距離を求める
GetCursorPos(&point);
xx = x - point.x;
yy = y - point.y;
mov = (LONG)sqrt(xx * xx + yy * yy);
// 移動時間を求める
movtimes = MulDiv(1000,mov,pps);
// 移動ルーチン
timorg = (LONG)GetTickCount();
do{
// 移動位置を計算
if((timwrk = (LONG)GetTickCount() - timorg) >= movtimes){
mx = x;
my = y;
}else{
mx = point.x + MulDiv(xx,timwrk,movtimes);
my = point.y + MulDiv(yy,timwrk,movtimes);
}
// マウス移動
SetCursorPos(mx,my);
// コールバック呼び出し
if(cb != NULL){if(!cb(mx,my,parm))return FALSE;}
}while(timwrk < movtimes);
return TRUE;
}
// 以下は、簡単な使用例です。
// [100,100]座標にマウスカーソルを移動させます。
MoveMouse(100,100,2000,NULL,0);