Python でマウス座標とキーコードを取得するサンプルスクリプトです。
以下の環境で動作確認をしています。
環境: Windows10, Anaconda, Python 3.X
※ tkinter, pyautogui をインストール済み
背景
Python がよく使われる分野に自動化があります。
自動化のプログラムをいくつか作っていると、マウスやキーボードについても自動で操作したくなることがあります。
この場合、キーボードのキーコードやマウス座標を取得する必要が生じます。
自動化以外にも、たとえば、写真や図形にマウスを合わせることで座標を読み取ることで線画を作る、といった用途にも活用できると思います。
もともとは自分で使うために作ったものですが、ご参考までに、キーコードとマウス座標を取得する方法について、サンプルコードやポイントをまとめ、公開しておくことにします。
使い方
① パソコン内にフォルダを作ってください。
② ①のフォルダ内に mouse_keycode.py 等の名前でテキストファイルを作成し、末尾のサンプルコードをコピー&ペーストで貼りつけて保存してください。
③ ②の Python のスクリプトを実行してください。
実行中にキーボードやマウスを操作すると、キーコードとマウス座標を取得して、アプリ上に表示します。
サンプルコードの説明
・ GUI の表示用に tkinter を使います。
マウス座標の取得に pyautogui、キーボードのキーコード取得に ctypes を使います。
そこで、スクリプトの冒頭でそれぞれをインポートしています。不要なものがあれば、動作確認後、削除等してください。
・ get_keycode1() 関数で、キーコードを取得しています。
たとえば、マウスを左クリックするとキーコードは1となり、右クリックすると2となります。
他に A、B、C、… 等のキーボードのキーを押し下げると 65、66、67、… 等の数値が取得できます。
・ show1() 関数で、pyautogui からマウス座標を取得し、上記のキーコードを含め、表示しています。
・ スクリプトを実行すると、root = … とした行以下が、順次、実行されます。tkinter で GUI のサイズやタイトルを設定し、関数 show1() を実行します。
・ show1() では、更新時間を 500 ms 毎とし、自分自身を呼び出しています。これにより、表示を更新し続ける動きとなります。更新時間は、必要に応じて調整してみてください。
・ 最後の root.mainloop() は、tkinter の GUI 表示のために必要なループです。
これにより、ユーザーインターフェースの画面を表示しつつ、500 ms 毎にキーコードとマウス座標を読み込んで表示する、といった動きになります。
まとめ
マウス座標とキーボードのキーコードを取得するスクリプトについてまとめました。
ネット検索をすると、各コマンドの断片的な解説は見つかります。しかし、全体として機能する程度に簡潔にまとまったサイトが見つかりませんでしたので、ポイントを整理しました。
サンプルでは、キーコードとマウス座標の取得についてまとめましたが、取得したキーコード、マウスの座標、キーイベントを送ることで、任意の自動化プログラムを作成できると思います。
マウスやキーボード以外にも、画像の保存など、自動化に使えるプログラムについてもまとめています。
もし関心があるようでしたら、関連リンクなども参考にしてみてください。
関連リンク
・ 指定したエリアの画像を保存するソフトウェア 【tkinter】
・ ウェブ検索と結果取得を自動化する【Python & selenium】
・ pyautogui で特殊文字( : @ ^ )を自動入力したいとき 【Python】
・ 円、矩形、直線を描画&ドラッグできるようにする【tkinter】
サンプルコード:マウス座標とキーコードの取得
import tkinter as tk1
import pyautogui as pa1
import ctypes as ct1
def get_keycode1():
key0 = -1
for key1 in range(1,241): # keycode
if key1 == 25:
continue
n1 = int( ct1.windll.user32.GetAsyncKeyState(key1)&0x8000 )
if n1 > 0:
key0 = key1
break
return key0
def show1():
x1, y1 = pa1.position()
k1 = get_keycode1()
str1 = "x: " + str(x1) + " y: " + str(y1) + "\n" + "keycode: " + str( k1 )
label1['text'] = str1
root.after(500, show1)
root = tk1.Tk()
root.geometry( "400x100" )
root.title( "mouse_coordinates and keycode" )
label1 = tk1.Label( root )
label1.place( x=10, y=10 )
label1.update()
show1()
root.mainloop()