Delphiメモ

No028:マウスカーソル位置の色を取得する方法

手順は

1.GetDCでデスクトップ全体のデバイスコンテキストを得る
2.マウスカーソル位置でGetPixelする
3.ReleaseDCでデバイスコンテキストを解放する

たったこれだけ。
以下に関数化したものを示す。

function GetCursorColor(P: TPoint): TColor;
var
  DC: HWND;
begin
  DC:= GetDC(HWND_DESKTOP);
  try
    Result:= GetPixel(DC,P.X,P.Y);
  finally
    ReleaseDC(HWND_DESKTOP,DC);
  end;
end;

GetCursor関数として引数に色を取得したい座標をTPoint型で指定し、返り値としてその座標の色を返す。
GetDCの引数はHWND_DESKTOPとしているが、ぶっちゃけ0でOK。
マウスカーソル位置の色を取得したい場合は、
関数を呼び出す時に引数にMouse.CursorPosを指定しておけばよい。

問題はどのイベントでこの関数を実行するか。
非アクティブ時でもキャプチャするためには通常のイベントでは対応できないので厄介。
考えられるパターンは2通り。

・マウスのメッセージをフックする
・タイマー等で定期的に更新する

マウスのフックにはDLLを使う方法が一番無難だが、正直面倒。
ジャーナルレコードだと簡単な反面、弊害が発生するのでよろしくない。
タイマー等で更新する場合、Timerコンポーネントだと精度が悪いためあまりつかえない。
精度の高いタイマーコンポーネントを利用するか、ApplicationEventsのOnIdleで捕まえる。
後者の場合はただ単にDone:= FalseとするとCPUが100%使用になるので、
適当にSleepをはさんでやらなけらばならない。

トップに戻る

関連ページ