今、マウスカーソルがどこにあるか知りたいときがありますよね?
通常、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 のサンプルが下でダウンロードできます。
サンプルには実行ファイルは含まれていません。
|