マウス・キーボード操作を受け付けないプログラムを操作する

1. 何ができるの?

UWSC, 自動操作ライブラリを使っても操作できないプログラム・ゲームを操作できます。
マウスのポインタは動くけど、クリックができない場面に遭遇したので作ってみました。

※マウス・キーボードが誤動作して、PCの設定が変わった、Amazonで変なの買っちゃった、
などの動作をするかもしれなので、ご承知の上ご使用ください。
作者は責任を負いません。

(1)仕組み

作成したPythonライブラリからシリアル経由でArduino Pro Microを制御し、Arduino Pro Micro内部でHID機能を実行します。Arduino Pro Microからマウス・キーボード操作としてWindows・ゲーム等のプログラムを制御します。

Windows・ゲーム等のプログラムから見ると、USBでつながった物理的なマウス・キーボードで操作されている様にしか見えないので、UWSC, 自動操作ライブラリを使っても操作できないプログラム・ゲームも操作できるはずです。

2. 用意するもの

(1) Arduino Leonardo もしくは Arduino Pro Micro

Amzoznだとこれとか
ATmega32U4 5V 16MHz Arduino互換ボード (Leonardo)
Arduino Leonardo 開発ボード 超小型 USB ダイレクト ATmega32U4 ピンヘッダ付

楽天だとこれとか

created by Rinker
¥2,879 (2024/03/28 01:54:57時点 楽天市場調べ-詳細)
Pro Micro 3.3V / 8MHz Arduino互換マイクロコントローラ

(2) 実行プログラム

SerialHID.zip

3. 環境構築

(1) Arduino環境構築

https://www.arduino.cc/en/Main/SoftwareからArduino IDEをダウンロードしてインストール。

② [ファイル] – [環境設定] を開き、追加のボードマネージャのURLに以下を追加
https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json

③ [ツール] – [ボード] – [ボードマネージャ]を開く

SparkFun AVR Boardsで検索しインストール

⑤ [ツール] – [ボード] から、SparkFun Pro Microを選択

⑥ [ツール] – [プロセッサ]から、手元のArduino Pro Microにあった設定(3.3V or 5V)を選択

⑦ Arduino Pro MicroをPCにつなげる

SerialHID.zip内のSerialHID.inoを開く

⑨ [ツール] – [シリアルポート]から、⑦でつなげたArduino Pro Microのポートを指定

⑩ 左上の「→」(書き込みボタン)を押下

⑪ 書込み完了すればOK

(2) Python環境構築

① PySerialをインストール

pip install pyserial

SerialHID.zip内のSerialHID.pyをアクセス可能なディレクトリに配置

4. 使い方

基本的な使い方は、ArduinoのMouse, Keyboardライブラリを踏襲しています。
https://www.arduino.cc/reference/en/language/functions/usb/mouse/
https://www.arduino.cc/reference/en/language/functions/usb/keyboard/

(1) SerialHIDのインポート

import SerialHID

(2) ポート番号を指定

sh = SerialHID.SerialHID("COM1") #COM1を想定

(3) マウス、キーボードを作成

mouse = sh.Mouse()
keyboard = sh.Keyboard()

(4) マウスクリック

mouse.click() #左クリック
mouse.click('MOUSE_RIGHT') #右クリック

(3) マウスを動かす

x=100 #右方向がプラス、左方向がマイナス
y=200 #下方向がプラス、上方向がマイナス
mouse.move(x, y)

(4) マウスのホイールボタンを押下後、1秒たったら離す

mouse.press('MOUSE_MIDDLE')
time.sleep(1)
mouse.release('MOUSE_MIDDLE')

(5) キーボード入力

str = "ABCabc\n123"
keyboard.print(str) #文字列入力
key = keyboard.KEY_TAB  #TABキー
keyboard.write(key)

(4) 左Shiftキーを押下し、aを入力後、左Shiftキーを離す

key = keyboard.KEY_LEFT_SHIFT  #TABキー
keyboard.press(key)
keyboard.write('a')
keyboard.release(key)

コメント

  1. min より:

    SerialHID.zipをいただけないでしょうか。
    2台のPCから別のブラウザでDLできませんでした。

  2. CYY より:

    Arduino Leonardo にコードを書き込むところまではできたのですが、試しにTABキーを押すプログラムを書いたところ以下のようなエラーが出てしまいました。デバイスマネージャーでポートが正しいことは確認済みです。どうしたらいいでしょうか?
    プログラム:
    import SerialHID
    #Arduino Pro Micro のシリアルポートを指定
    sh = SerialHID.SerialHID(“COM6”)
    #マウス、キーボードの作成
    mouse = sh.Mouse()
    keyboard = sh.Keyboard()
    key = keyboard.KEY_END

    エラーコード:
    keyboard.write(key)
    runfile(‘C:/.conda/Arduino/タイトル無し4.py’, wdir=’C:/.conda/Arduino’)
    Reloaded modules: SerialHID
    Traceback (most recent call last):

    File “C:\.conda\Arduino\タイトル無し4.py”, line 10, in
    sh = SerialHID.SerialHID(“COM6”)

    File “C:\.conda\Arduino\SerialHID.py”, line 8, in __init__
    SerialHID.ser = serial.Serial(portNum, 9600)

    File “C:\anaconda3\envs\Arduino\lib\site-packages\serial\serialwin32.py”, line 31, in __init__
    super(Serial, self).__init__(*args, **kwargs)

    File “C:\anaconda3\envs\Arduino\lib\site-packages\serial\serialutil.py”, line 240, in __init__
    self.open()

    File “C:\anaconda3\envs\Arduino\lib\site-packages\serial\serialwin32.py”, line 62, in open
    raise SerialException(“could not open port {!r}: {!r}”.format(self.portstr, ctypes.WinError()))

    SerialException: could not open port ‘COM6’: PermissionError(13, ‘アクセスが拒否されました。’, None, 5)

    • t.uchida より:

      ポートが正しいことは確認済み、とのことなので、考えられる原因としては以下の2つがあります。
      ① TeraTermなどの他のプログラムでポートをつかんだままになっている (記載いただいたサンプルプログラムだとCOM6を開いたままになっている)
      ② 本プログラムを2重に実行しており、最初に実行したプロセスが残り続けて、後から実行したプロセスでポートを開けなくなっている

      また、確率は低いですが、Windowsがポートの認識に失敗している?事象に出会ったこともあり、一度デバイスマネージャーにてArduino Leonardo(COM6)をアンインストールし再度USBを挿しなおしてポートを再認識させると動くようになったため、上記①②の状態となっていない場合は一度アンインストールを試してみていただけますでしょうか?

      • CYY より:

        返信ありがとうございます。プログラムを2重に実行していたみたいです。最初に実行したプログラムを終了させるにはどうしたらいいでしょか?

        • t.uchida より:

          「プログラムを2重に実行していたみたいです。」はどのようにして2重に実行していたことを確認されましたでしょうか?
          もし。最初に実行したウィンドウがあるようでしたらそれを×ボタンで閉じていただき、タスクマネージャーからプロセスが2重に動いていることを確認されたのでしたらタスクマネージャーからプロセスを停止していただければよいかと思います。
          確実を期すならPCごと再起動するのが良いかと思います。

          • CYY より:

            一度目は正常に動作したのですが二度目以降はアクセスが拒否されてしまったのでプログラムが二重に実行されていたと判断しました。Spyder でプログラムを実行していたのでコンソールのタブを閉じることで解決しました。いちいち閉じるのは面倒なので別の方法を探してみます。

タイトルとURLをコピーしました