【VBA×WindowsAPI】GetCursorPos関数の使い方
GetCursorPos関数
GetCursorPos関数は現在のマウスカーソル位置の座標を取得するための関数です。
Windowsの座標にはクライアント領域座標とスクリーン座標という2つの座標系が存在します。
クライアント領域座標は下図でいう(x,y)のようにウィンドウやコントロール(ボタンやテキストボックス等)の左上を基準とした座標です。対してスクリーン座標は文字通りスクリーン上の座標のことをいい下図でいう(x’,y’)のようにスクリーンの左上を基準とした座標です。
これら座標系のうちGetCursorPos関数はスクリーン座標系での座標が取得できます。クライアント領域座標として取得したい場合は、本関数でスクリーン座標として取得した後、ScreenToClient関数を使ってクライアント領域座標に変換することで取得することが可能です。
使用方法
GetCursorPos関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function GetCursorPos Lib “user32” (lpPoint As POINTAPI) As Long
Declare Function GetCursorPos Lib “user32” (lpPoint As POINTAPI) As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
1 2 3 4 5 |
#If VBA7 Then Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long #Else Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long #End If |
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
引数に使われている「POINTAPI」は下記のように構造体として定義しておく必要があります。
座標を扱う関数で利用されることが多く、ある地点のx座標、y座標を格納するための構造体です。
1 2 3 4 |
Type POINTAPI x As Long y As Long End Type |
構文
GetCursorPos関数の構文は下記のように書きます。
lRet = GetCursorPos(lpPoint)
引数
lpPoint (POINTAPI型)
POINTAPI構造体で宣言した変数を入力します。
本関数実行後、ここで入力したPOINTAPI構造体の変数内に、現在のカーソル位置のスクリーン座標が格納されます。(ByRefで入力しているため in/out を兼ねている)
戻り値
lRet (Long型)
戻り値は関数が成功した場合は「0以外」です。
失敗した場合は「0」が返されます。
サンプルコード
以下はGetCursorPos関数を使って、現在のマウスカーソルの位置をスクリーン座標として取得し、イミディエイトウィンドウに出力するサンプルコードです。下記のコードをUserFormやWorkSheetイベント内で使用することでユーザーのアクションから動的にカーソル位置を取得することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Type POINTAPI x As Long y As Long End Type Sub main() Dim lRet As Long Dim tCoord As POINTAPI lRet = GetCursorPos(tCoord) Debug.Print "x座標: " & tCoord.x Debug.Print "y座標: " & tCoord.y End Sub |
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:GetCursorPos 関数 (winuser.h) – Win32 apps