【VBA×WindowsAPI】SetCursorPos関数の使い方
SetCursorPos関数
SetCursorPos関数はマウスカーソルを指定の座標に移動するための関数です。
Windowsの座標にはクライアント領域座標とスクリーン座標という2つの座標系が存在します。
クライアント領域座標は下図でいう(x,y)のようにウィンドウやコントロール(ボタンやテキストボックス等)の左上を基準とした座標です。対してスクリーン座標は文字通りスクリーン上の座標のことをいい下図でいう(x’,y’)のようにスクリーンの左上を基準とした座標です。
これら座標系のうちSetCursorPos関数はスクリーン座標系での座標が必要になります。
指定のウィンドウ(もしくはコントロール)のクライアント領域座標を使ってカーソルの移動先を指示したい場合は、クライアント領域座標をスクリーン座標に変換した座標を入力する必要があります。この座標変換はClientToScreen関数を使うことで簡単に処理することができます。
使用方法
SetCursorPos関数を使用するにはあらかじめ関数の宣言しておく必要があります。
※宣言をしないと関数は使えずにエラーとなるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く文言が違います。
環境に合わせて以下のいずれかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内で各関数を使うことができるようになります。
Declare PtrSafe Function SetCursorPos Lib “user32” _
(ByVal x As Long, ByVal y As Long) As Long
Declare Function SetCursorPos Lib “user32” _
ByVal x As Long, ByVal y As Long) As Long
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では使えない方の構文が赤色で表示される場合がありますが、実行に影響はありません。
1 2 3 4 5 |
#If VBA7 Then Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long #Else Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long #End If |
各関数の宣言文は「Private/Public」を付けて各関数の有効範囲を指定することもできます。
・Public Declare PtrSafe Function~ :モジュール外で呼び出し有効
構文
SetCursorPos関数の構文は下記のように書きます。
lRet = SetCursorPos(x, y)
引数
x (Long型)
カーソルの移動先のX座標(スクリーン座標系)を入力します。
y (Long型)
カーソルの移動先のY座標(スクリーン座標系)を入力します。
戻り値
lRet (Long型)
戻り値は関数が成功した場合は「0以外」です。
失敗した場合は「0」が返されます。
サンプルコード
以下はSetCursorPos関数を使って、カーソルをスクリーンの左上に移動するサンプルコードです。
1 2 3 4 5 6 7 8 |
Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Sub main() 'カーソル位置設定 (スクリーン座標) Call SetCursorPos(0, 0) End Sub |
FindWindow関数とClientToScreen関数を使うことでウィンドウの位置に応じてカーソルの移動先を動的に追従させることも可能です。メモ帳ウィンドウを開いた状態で下記コードを実行すると、ウィンドウの左上(正確にはクライアント領域の左上)にカーソルを移動させることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr Declare PtrSafe Function ClientToScreen Lib "user32" (ByVal hWnd As LongPtr, lpPoint As POINTAPI) As Long Declare PtrSafe Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Type POINTAPI x As Long y As Long End Type Sub main() Dim hWnd As LongPtr Dim tCoord As POINTAPI 'メモ帳のウィンドウハンドルを取得 hWnd = FindWindow("notepad", vbNullString) 'ウィンドウ(クライアント領域)上の座標を設定 tCoord.x = 0 tCoord.y = 0 '指定座標をクライアント領域からスクリーン座標に変換 Call ClientToScreen(hWnd, tCoord) 'カーソル位置設定 (スクリーン座標) Call SetCursorPos(tCoord.x, tCoord.y) End Sub |
VBA×WindowsAPIまとめページ
その他のWindowsAPI関数は下記ページにまとまっているので合わせて参照下さい。
参考
Microsoft公式:SetCursorPos 関数 (winuser.h) – Win32 apps