【python】標準モジュールでマウスカーソル位置を取得したい

【python】標準モジュールでマウスカーソル位置を取得したい

 標準外モジュールを使えない場合にマウスカーソルを取得したいことがありましたので、参考までに公開します。windowsのdllを使用しますので、環境はwindowsに限られます。個人的にはclassを使いたくないのですが、classを使う以外でうまく動きませんでしたので、今回のプログラムではclassを使っています。

マウスカーソルの移動はこちらを参照ください。
https://sun-sun-sunday.com/python/python_mouse-cursor_get_standard_module/

プログラム

"""
####コメント####
マウスカーソル座標取得のためにwindowsのdllであるuser32のGetCusorPos(API)を使用する


【手順】
①pythonでwindows dllを使用するためにctypesをimportする
②dllを使うためにctypes.byrefを使用するが、オブジェクトとして渡す必要があるためclassを作成する
③classを変数にして、ctypes.byrefでdllに渡せるようにする
④user32.GetCursorPosに引数として渡すと返り値としてxy座標が返ってくる
#################
"""


#手順①
import ctypes

#手順②
class POINT(ctypes.Structure):
    _fields_ = [("x", ctypes.c_int),
                ("y", ctypes.c_int)]


#手順③
cursor = POINT()
args=ctypes.byref(cursor)


#手順④
ctypes.windll.user32.GetCursorPos(args)
pos=[cursor.x,cursor.y]
x_axis=pos[0]
y_axis=pos[1]

print(pos)
print(x_axis)
print(y_axis)

解説

■16行目
pythonでwindows dllを使用するためにctypesをimportする。

■19~21行目
dllを使うためにctypes.byrefを使用するが、オブジェクトとして渡す必要があるためclassを作成する。ここでx,y以外に続けて定義してもエラーにはならないが、マウスカーソルはxyだけあれば問題ない。

■25~26行目
classを変数にして、ctypes.byrefでdllに渡せるようにする。
POINT()のままctypes.byrefに渡してもエラーは出ないが、結果が[0,0]となる

■30行目
ctypesでwindows dllのuser32.GetCursorPosを実行する。
26行目で作成したargsを渡すとcursorで定義したxとyにマウスカーソル座標が入力される。
(注)windowsのディスプレイ設定で拡大縮小(推奨設定150%など)に設定していると画面の座標位置が解像度の位置と異なります。その位置に対して絶対座標位置で移動をさせると意図しない場所にカーソルが移動しますので、相対座標で指定するか、拡大縮小設定を100%にしてください。



■31~37行目
31行目でxy座標位置をリストで定義する。
32と33行目でx座標とy座標を単体で取り出す。
35~37行目で結果をprintで出力する(実行結果に表示されているものはコレ)

実行結果