【python】標準モジュールでマウスを動かしたい
- 2022.07.17
- python
標準外モジュールを使えない場合にマウスを移動させたいことがありましたので、参考までに公開します。windowsのdllを使用しますので、環境はwindowsに限られます。個人的にはclassを使いたくないのですが、classを使う以外でうまく動きませんでしたので、今回のプログラムではclassを使っています。
マウスカーソル位置の取得は下記を参照ください。
【python】標準モジュールでマウスカーソル位置を取得したい │ プログラミングのメモ帳 (sun-sun-sunday.com)
プログラム
#手順①
import ctypes
#手順②
ULONG_PTR = ctypes.POINTER(ctypes.c_ulong)
class MOUSEINPUT(ctypes.Structure):
_fields_ = [("dx", ctypes.c_long),
("dy", ctypes.c_long),
("mouseData", ctypes.c_ulong),
("dwFlags", ctypes.c_ulong),
("time", ctypes.c_ulong),
("dwExtraInfo", ULONG_PTR)]
class INPUT(ctypes.Structure):
_fields_ = [("type", ctypes.c_ulong),
("mi", MOUSEINPUT)]
#手順③
LPINPUT = ctypes.POINTER(INPUT)
SendInput = ctypes.windll.user32.SendInput
SendInput.argtypes = (ctypes.c_uint, LPINPUT, ctypes.c_int)#引数の型指定
SendInput.restype = ctypes.c_uint#戻り値の型指定
#手順④
x, y = 10, 10
x = x * 65536 // 1920#切り捨ての割り算
y = y * 65536 // 1080#切り捨ての割り算
_mi = MOUSEINPUT(x, y, 0, (0x0001 | 0x8000), 0, None)#絶対座標の時に入れる(" | 0x8000")
SendInput(1, INPUT(0, _mi), ctypes.sizeof(INPUT))#0がマウス入力
解説
■2行目
pythonでwindows dllを使用するためにctypesをimportする。
■8~20行目
dllを使うためにオブジェクトとして渡す必要があるためclassを作成する。
■25~29行目
windows dllのuser32.SendInputを呼び出し、引数と戻り値を指定する。
■33行目
マウス移動位置の絶対座標位置を指定
■34~34行目
SendInputで扱えるように座標を計算する(切り捨ての割り算)。
※座標の絶対値が異なるので変換が必要。解像度によって変換式は変更ください(目標座標x:1920=x:65536)
■36行目
SendInputに渡すためにMOUSEINPUTに数値を入れてオブジェクトとする。
※mouseData
・マウスホイール回転数
※dwFlags
・0x0001=カーソル移動
・0x8000=絶対座標
(指定しない場合は相対座標。ビット演算子の|
演算子ごと削除ください)
■38行目
SendInputに必要な引数を渡す(INPUTの0でマウス入力を指定)
実行結果
特にありません。上記の通りであれば私の環境では画面の左上にマウスカーソルが移動します。
あとがき
とりあえず動いていますが、あまり自信ないです。これとマウスカーソルを指定するプログラムを組み合わせてカーソル移動の自動化を試みる予定です。
-
前の記事
【python】標準モジュールでマウスカーソル位置を取得したい 2022.07.16
-
次の記事
【python】テキストファイルを読み込む 2022.07.23