〜 インプット 〜
マウスボタンを自動的にクリック2 (要USER32.DLL)

マウスカーソルの位置取得はmousexmousey、マウスカーソルの位置設定はmouse命令で処理できます。
また、クリック判定はstick命令やgetkey命令、onclick命令で取得することが出来ますが、
クリックさせたり、右クリックさせたりすることはできませんので、
従来はコチラで紹介したAPImouse_event関数が使われました。
ただ、この関数は少々古く、ウィンドウズ2000頃からはSendInput関数の利用が推奨されていますので、
当ページではSendInput関数を使ったサンプルを書いています。

SendInput関数は、動作イベントを複数個指定することができるので、
同時にキーを操作したり、マウスを一連の動作で制御する場合に役立つのではないでしょうか?
UINT SendInput {
DWORDnInputs,// イベント数
LPINPUTpInputs,// 入力イベントINPUT構造体の配列
intcbSize// 構造体サイズ
};
具体的な指定方法はサンプルを見ていただきたいのですが、 マウスボタンの押込等、1つの動作しかしない場合、SendInput関数の第1引数に指定するイベント数は。 第2引数のイベント配列の説明は後に回すとして、第3引数のINPUT構造体サイズはタイプ値の4バイトと、 MOUSEINPUT構造体のサイズを合せた28バイトを指定します。
Type INPUT {
DWORDtypes// 入力タイプ(ココでは MOUSEINPUT 構造体を指定)
union {
MOUSEINPUTmi,// INPUT_MOUSE(=0x00) の場合に使用
KEYBDINPUTki,// INPUT_KEYBOARD(=0x01) の場合に使用
HARDWAREINPUThi,// INPUT_HARDWARE(=0x02) の場合に使用
};
};
イベント配列であるSendInput関数の第2引数にはINPUT構造体を用いますが、 INPUT構造体のメンバ1は今回マウスを使用と言うことで、INPUT_MOUSE(=0x00)を使用します。
定数コード内容
INPUT_MOUSE0x00マウスイベントを発生
INPUT_KEYBOARD0x01キーボードイベントを発生
INPUT_HARDWARE0x02ハードウェアイベントを発生
メンバ2はこれから説明するMOUSEINPUT構造体を選択します。
Type MOUSEINPUT {
DWORDdx,// マウスX座標
DWORDdy,// マウスY座標
DWORDdw,// マウスホイールの移動
DWORDdwFlags,// マウスの動作フラグ
DWORDtime,// ミリ秒単位のタイムスタンプ
DWORDdwExtraInfo// 32ビットの追加情報
};
メンバ1やメンバ2のマウスの座標、メンバ3のホイールの移動は、 メンバ4の動作フラグにAPImouse_event関数同様の指定を行います。 マウスカーソルを移動するなら動作フラグにMOUSEEVENTF_MOVEを使用して、 MOUSEEVENTF_ABSOLUTEを加えていれば絶対座標、なければ相対座標です。 ホイールを回転するなら動作フラグにMOUSEEVENTF_WHEELを使用して、 マウス奥の方へ回転させる場合にプラス値であるWHEEL_FORWORD(=0x00000001)、 手前へ回転させる場合にマイナス値であるWHEEL_BACKWORD(=0xFFFFFFFF)を指定します。 メンバ4の動作フラグは次の意味ある組み合わせを指定します。
定数コード動作内容
16進10進
MOUSEEVENTF_MOVE0x00011マウスカーソルの移動
MOUSEEVENTF_LEFTDOWN0x00022マウス左ボタンの押込
MOUSEEVENTF_LEFTUP0x00044マウス左ボタンの解放
MOUSEEVENTF_RIGHTDOWN0x00088マウス右ボタンの押込
MOUSEEVENTF_RIGHTUP0x001016マウス右ボタンの解放
MOUSEEVENTF_MIDDLEDOWN0x002032マウス中央ボタンの押込
MOUSEEVENTF_MIDDLEUP0x004064マウス中央ボタンの解放
MOUSEEVENTF_XDOWN0x0080128マウスXボタンの押込(Windows2000〜)
MOUSEEVENTF_XUP0x0100256マウスXボタンの解放(Windows2000〜)
MOUSEEVENTF_WHEEL0x08002048マウスホイールの回転(Windows2000〜)
MOUSEEVENTF_ABSOLUTE0x800032768正規化された絶対座標(指定しない場合は相対座標)
メンバ5はミリ秒単位のタイムスタンプを指定する要素となりますが、 どうやらこのメンバは無視されるとのことですので、0としておきましょう。 メンバ6も、通常利用する分には使用しませんので、0としておきましょう。

dragdrop 開始X, 開始Y, 終了X, 終了Y
開始Xドラッグ始点X座標を指定する。
開始Yドラッグ始点Y座標を指定する。
終了Xドロップ終点X座標を指定する。
終了Yドロップ終点Y座標を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
	ll_libload user, "user32.dll"
	ll_getproc SendInput, "SendInput", user

#module
#deffunc dragdrop int, int, int, int
	mref sx, 0 : mref sy, 1 : mref ex, 2 : mref ey, 3
	dim inputs, 28
	inputs.0  = 0, sx * 65536 / dispx, sy * 65536 / dispy, 0, 0x8001, 0, 0
	inputs.7  = 0, 0, 0, 0, 0x0002, 0, 0
	inputs.14 = 0, ex * 65536 / dispx, ey * 65536 / dispy, 0, 0x8001, 0, 0
	inputs.21 = 0, 0, 0, 0, 0x0004, 0, 0
	prm = 4, 0, 28
	ll_getptr inputs : ll_ret prm.1
	ll_callfunc prm, 3, SendInput@
	return
#global

	screen 0, 400, 300, , 100, 50
	dialog "ウィンドウのドラッグアンドドロップを開始します"
	dragdrop 150, 55, 450, 355 // (150, 55)で掴み、(450, 355)で離す
	stop

dragdrop 開始X, 開始Y, 終了X, 終了Y
開始Xドラッグ始点X座標を指定する。
開始Yドラッグ始点Y座標を指定する。
終了Xドロップ終点X座標を指定する。
終了Yドロップ終点Y座標を指定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#uselib "user32.dll"
#func  global SendInput "SendInput" int, var, int

#module
#deffunc dragdrop int sx, int sy, int ex, int ey
	dim inputs, 28
	inputs.0  = 0, sx * 65536 / ginfo_dispx, sy * 65536 / ginfo_dispy, 0, 0x8001, 0, 0
	inputs.7  = 0, 0, 0, 0, 0x0002, 0, 0
	inputs.14 = 0, ex * 65536 / ginfo_dispx, ey * 65536 / ginfo_dispy, 0, 0x8001, 0, 0
	inputs.21 = 0, 0, 0, 0, 0x0004, 0, 0
	SendInput 4, inputs, 28
	return
#global

	screen 0, 400, 300, , 100, 50
	dialog "ウィンドウのドラッグアンドドロップを開始します"
	dragdrop 150, 55, 450, 355 // (150, 55)で掴み、(450, 355)で離す