【python】標準モジュールでマウスを動かしたい

【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でマウス入力を指定)

実行結果

特にありません。上記の通りであれば私の環境では画面の左上にマウスカーソルが移動します。

あとがき

とりあえず動いていますが、あまり自信ないです。これとマウスカーソルを指定するプログラムを組み合わせてカーソル移動の自動化を試みる予定です。