【Python RPA】クリック・キーボード操作を検知する方法(ctypes.windll)

2020.05.13 /

【Python RPA】クリック・キーボード操作を検知する方法(ctypes.windll)

業務効率化のためRPA(Robotic Process Automation)の導入または作成を考えている会社は昨今とても多いです。

既存のRPAソフトを導入する場合、多額の費用が掛かるので導入に踏み出せない会社も非常に多いです。

本記事は既存RPAソフトではなく、Pythonを使って自作RPAを考えている人向けの内容です。

RPA作成に必要不可欠な、ユーザーのクリック及びキーボード操作を検知する方法を解説いたします。

Windows API(Win32API)を呼び出す方法

クリック及びキーボード操作を検知するために、Windows API(Win32API)を使用します。

ctypesというモジュールを使用しますが、Python2.5以降は標準モジュールであるため、ctypesを別でインストールする必要はないです。

ctypesはPythonからC言語で書かれている動的リンク/共有ライブラリ内の関数(dllなど)を呼び出すのに使用します。

IT用語の確認

dll(dynamic link library)とは、様々なプログラムで使用される機能をもった、部品化されたプログラムのこと。

下記コードをプログラムの先頭に記入して、ctypesモジュールをインポートします。

import ctypes

Windowsのdllを呼び出すにはctypes.windllを使用し、あとにdll名を続けます。

以下にdllの呼び出し例として、MessageBox APIを呼び出しメッセージボックスを表示させるプログラムを記します。

import ctypes
ctypes.windll.user32.MessageBoxW(0,"MessageBox Test", "Pythonでwindows dll呼び出し", 0x00000040)

MessageBox関数はuser32.dllにエクスポートされているため、ctypes.windll.user32と記入し、user32.dllを読み込んでいます。

MessageBox関数の第一引数は親ウィンドウのハンドル(0でOK)、第二引数はメッセージボックスに表示するテキスト、第三引数はタイトル、第四引数はアイコン
(MB_ICONINFORMATION=0x00000040)
をそれぞれ渡しています。

またWindows APIにはANSI版とユニコード版(ワイドキャラクター)があり、MessageBoxWではワイドキャラクタを使用しています。

サンプルプログラムを実行すると以下メッセージボックスが表示されます。

ctypes.windll.user32でのMessageBox

クリック・キーボード操作を検知する方法

Windows API(Win32API)を使ってPythonプログラム内でクリックやキーボード操作を検知する方法について解説します。

クリック・キーボード操作の検知には、Win32APIのGetAsyncKeyState関数を使用します。

GetAsyncKeyStateはuser32.dllにエクスポートされているので、MessageBox関数と同様にuser32.dllを読み込んで使う必要があります。

サンプルコードとして、以下に左クリックを検出、Escキーでプログラムを終了するプログラムコードを記します。

import ctypes
import pyautogui

try:
    while True:
        if ctypes.windll.user32.GetAsyncKeyState(0x01) == 0x8000:
            print('左クリック')
            pyautogui.sleep(0.2)
        elif ctypes.windll.user32.GetAsyncKeyState(0x1B) == 0x8000:
            print("Escが押されました")
            break
except KeyboardInterrupt:
    print('終了')

サンプルコードでは、まずctypesモジュールとpyautoguiモジュールをインポートします。

次にwhile True:で無限ループに入ります。Escキーを押すかexcet KeyboardInterrupt(ctrl + Cの同時押下)が発生すると無限ループを脱出して、プログラムが終了します。

クリックやキーボードの検知に使用するctypes.windll.user32.GetAsyncKeyState()には引数にキーコードを渡します。

サンプルコードでは左クリック(0x01)とEscキー(0x1B)ですね。

引数に渡したクリックやキーが押されると0x8000が返ってきます。

これを使いユーザーのクリックやキー操作を検知することができます。

また無限ループ(while True:)を出るのには、break文を使用しています。

まとめ

マウス操作やキーボード操作を検知できるようになることは、RPA作成において大きな一歩になります。

ぜひRPA作成に役立ててください。