知り合いが「膨大なテキストを一行ずつコピペする」というスゲーしち面倒な作業をしてんだよ。ペースト先のアプリケーションの仕様で、まとめて全部貼り付けることができないんだ。貼り付ける先がテキストエリアじゃなくて改行不可のテキストボックスだから。だからそいつは、

  • 一行コピーする。
  • 対象アプリ開いてテキストボックスにペーストする。
  • またテキストへ戻って、一行コピーする。
  • 対象アプリ開いて次のテキストボックスにペーストする。
  • 以下ずっと繰り返し。

なんつー気が狂いそうな作業をしていた。だからその作業の自動化ツールを作ってやったわけさ。

一行ずつコピペしたいテキストをこんなふうに用意しとく。

以下が設定ファイル。一番下に、自動化する行動の順番を書く。今回は「改行して、一行コピペして、改行する」ってのをワンループとする。

実行すると、指定したアプリケーションが前面に出てきて、設定した行動を自動で行ってくれる。今回の場合、メモ帳が出てきて、改行コピペ改行が自動で行われる。

今回はユーザを上述の知り合いに限定してるから汎用的なツールではない。その知り合いに必要な入力が「改行、コピペ、『0』を入力」だけだったから、それ以外の行動は登録できない。あと、元テキストから空白を除いたり、空き行は無視するようになってる。だけどプログラムを使って入力を再現できるノウハウが手に入ってよかったぜ。ネトゲのBOTとかもこういうのが元になってたのかな。すくなくとも連打ゲー用のチートツールくらいなら、もう作れそうだ。

ソースは冒頭の公開セットに同梱してあるんで、今回新出だったtipsを書いとく。

対象のアプリケーションを引っ張り出すには?
こう。
subprocess.Popen('call notepad.exe', shell=True)

subprocessはビルトインモジュールなので簡単だね。んー、もしメモ帳が複数起動していて、そのうちのひとつだけを対象にしたい場合はこれじゃあダメだよね。複数のウィンドウのうちひとつを選択して引っ張り出さないといけなさそうだが……うん、そのへんは機会があったらトライかな。こないことを祈る。メチャ面倒そうな予感がする。

キー操作の代行
今回の主役。
user32 = ctypes.windll.user32
user32.keybd_event(ここにキーコード, 0, 0, 0)   # 押す
user32.keybd_event(ここにキーコード, 0, 0x2, 0) # 離す

えーとこれはちょっと調べた感じ、「ビルトインモジュールctypesが、windllっていうWindowsのapiを呼び出して、その中のuser32っていうapiを使わせてもらう」って流れみたいだ。キーコードは十進数で表記(参考サイト:仮想キーコード一覧)。

コピペを代行
こう。
pyperclip.copy('対象テキスト')
time.sleep(0.1)
user32.keybd_event(cls._KEYCODE_CTRL, 0, 0, 0)
user32.keybd_event(cls._KEYCODE_V, 0, 0, 0)
user32.keybd_event(cls._KEYCODE_CTRL, 0, 0x2, 0)
user32.keybd_event(cls._KEYCODE_V, 0, 0x2, 0)

今回コピペしたいテキストはプログラム側がもってるので、動作としては、「テキストをクリップボードに貼り付けて」「Ctrl+Vを代行させてペーストする」って方式をとってみた。クリップボード操作のpyperclipはビルトインではないからpipでインストールしないとダメ。クリップボード操作の直後の「0.1秒待機」が意外に超重要で、これを挟まないとコピペのとき想定通りの動きをしないことがある。クリップボードへの貼り付けが終わる前にCtrl+Vを押しちゃったりするのが原因かなあ? たぶん。