Tips Area

 API No.2 スクリーン上のマウスカーソルの位置を取得


 今、マウスカーソルがどこにあるか知りたいときがありますよね?
 通常、VBではどれかのコントロールの上を通過したときにMouseMoveイベントが発生するくらいで、それ以上の情報は提供してくれません。

 VB標準の機能を使っていると、次のような問題があります。

  • 任意のタイミングでマウスカーソルの座標が取得できない
  • スクリーン上での座標を求めるのが面倒
  • 自作のプログラムで使用しているウィンドウ(フォーム)以外の場所にカーソルがあると座標を取得できない

 とりあえずはこんな所でしょうか。
 上2つはある程度は何とかなります。
 例えば、1つめはこんな感じ。

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)↓
    plCurPosX = X↓
    plCurPosX = Y↓
End Sub↓
↓
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)↓
    plCurPosX = X + Command1.Left↓
    plCurPosX = Y + Command1.Top↓
End Sub↓

 この場合、plCurPosX、plCurPosYをパブリック変数にして宣言しておきます。
 要するに、カーソルの座標が取得できるときに情報を取得して保存しておく、という方法です。
 上の例ではフォーム上にはCommand1が一つあるだけですが、当然、フォーム上にある全てのコントロールに上記のようなコードを書かなくてはなりません。

 次に、2つめは下のようになります。

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)↓
    plCurPosX = X + Me.Left + (Me.Width - Me.ScaleWidth) / 2↓
    plCurPosX = Y + Me.Top + ((Me.Height - Me.ScaleHeight) - (Me.Width - Me.ScaleWidth) / 2)↓
End Sub↓

 ちょっとややこしいですが、こんな感じになります。
 ちなみに、これもMouseMoveイベントが起きないとどうしようもないコードです。

 また、上のコードはわかりやすさを重視した為に、式が野暮ったいです。実際にプログラムする際には、この辺も手を加える必要があります。


 さて。
 ここからが問題です。3つめはVBの機能だけではどうしようもありません。
 そこで、ようやくAPIの登場です。

 スクリーン上のマウスカーソルの座標を取得するにはGetCursorPosというAPIを使います。
 なお、このAPIで取得した座標はピクセル単位なので、フォームの標準の単位系であるTwipsとは直接やりとりできません。Screen.TwipsPerPixelXを掛けるなどして使う必要があります。

 まず、新しいプロジェクトを作成し、標準モジュールを追加します。そして、以下のコードを書きます。

Declare Function GetCursorPos Lib "USER32" (lpPoint As POINTAPI) As Long↓
↓
Type POINTAPI↓
    x As Long '点のx座標↓
    y As Long '同、y座標↓
End Type↓

 次に、下の絵を参考にして、フォームをデザインします。
 次のコントロールが配置されていれば、デザインは任意で構いません。

  • Label1 (ラベル)
  • Timer1 (タイマー)   (Intervalプロパティは1以上の小さな数字をセット)

画面デザイン

 それでは次に、フォームコードを編集します。
 コードウィンドウを開いて、Form_Load等と表示されていたら全て選択して削除します。
 その後、下のコードを書き込みます。

Private Sub Timer1_Timer()↓
    Dim tCurPos As POINTAPI↓
↓
    '現在のカーソル座標を取得↓
    GetCursorPos tCurPos↓
↓
    '取得した座標を表示↓
    Label1.Caption = "(" & CStr(tCurPos.x) & "," & CStr(tCurPos.y) & ")"↓
End Sub↓

 これを実行すれば、現在のマウスカーソルの位置が常に表示されます。
 表示の更新の間隔はTimer1コントロールのIntervalプロパティで設定した間隔になります。


 今回の Tips のサンプルが下でダウンロードできます。
 サンプルには実行ファイルは含まれていません。

 スクリーン上のマウスカーソルの位置を取得(VB5以降) (1.41KB)
   Download 

→ Tips  → Top  

Build & Management is Wajin Kisaragi
WK Project 1998-2001

Mail address is feb_tr@mail.goo.ne.jp