バックグラウンドのアプリケーションにキー入力(ショートカットキー)を送りたい

ゲームをやりながら YouTube 配信をするにあたって、ゲームプレイ画面の結果に応じてバックグラウンドで動かしているアプリケーションのショートカットキーを叩くために、バックグラウンドアプリケーションにキー入力を送りたいと思うことがありました。

そのために使えそうな方法を調べてみたので、紹介してみようと思います。

筆者の場合

以前の記事で、OBSで画像認識を使って画面内のソースに変化を起こす方法を取り上げました。

また、立ち絵の口パクツールについても以前の記事で紹介しています。

ここで取り上げてる口パクツールである Puppet3 はショートカットキーでカスタマイズを変更できる機能があります。これと、OBSの画像認識を合わせて

「ゲームのプレイ中、自己ベストの更新を画像認識できた場合に Puppet3 のショートカットキーを叩いて笑顔用カスタマイズに変更する」

というのが筆者のやりたいことでした。

OBSの画像認識の記事で取り上げている Advanced Scene Switcher ではキー入力をアクションとして設定できるので簡単に実現できそうだと最初は思っていましたが、実はそう簡単ではありませんでした。

というのも、筆者のプレイしているゲームの場合、一瞬でも他のアプリケーションがフォアグラウンド実行になってしまうとウインドウが最小化してしまうため、強制的にプレイを中断せざるを得ない状況になってしまいます。

また、特定のアプリケーションにキー入力を送るためには”基本的には”そのアプリケーションをフォアグラウンド実行にする必要があります。

例えば Google Chrome とメモ帳を同時に開いているとき、Google Chrome に文章を入力している間はメモ帳には文章が入力されません。これはメモ帳がバックグラウンド実行になっているからであり、メモ帳に入力をしたい場合はまずメモ帳のウインドウを1度クリックするなどしてフォアグラウンド実行の状態に移してあげることが必要になります。

したがって

“プレイ中のゲームのフォアグラウンド実行状態を維持しながら、バックグラウンドのアプリケーションにキー入力を送らなければいけない”

という状況であり、それなりに制約があることが分かりました。

解決方法

いろいろと紆余曲折がありましたが、最終的にたどり着いたのが AutoHotkey を使う方法でした。

AutoHotkey も非常に多くの機能があるようで、まだ筆者は全然その全容を掴めてはいないのですが、親切な日本語のリファレンス(AutoHotkeyJP)もあるので、時間をとって一通り読めれば活用できそうな気がします。(ある程度のプログラミング経験は前提となってきそうですが…)

今回の問題解決においては、AutoHotkey の以下2つの機能が使えます。

  • ControlSend: キー入力を指定のウィンドウやコントロールに送信
  • DetectHiddenWindows: ウィンドウ探索時に非表示になっているウィンドウを検出対象にするかを設定する

この AutoHotkey でバックグラウンドのアプリケーションにキー入力を送れるようにする状態にするために必要な手順のステップ自体はシンプルで

  1. AutoHotkey のインストール
  2. AutoHotkey のスクリプトを作成
  3. AutoHotkey のスクリプトを実行

の3ステップになります。

AutoHotkey のインストール

(※2022-10-07時点で確認できた手順になります)

AutoHotkey にアクセスし、「Download」をクリックします。

AutoHotkeyサイトの画面

クリックすると表示が変わるので、「Download Current Version」をクリックしましょう。

AutoHotkeyサイトの画面

環境に合わせたインストーラがダウンロードされるので、あとはインストーラを実行して指示に従いましょう。

AutoHotkey のスクリプトを作成

こちらの記事で紹介した Advanced Scene Switcher では、以下画像のようにキー入力を送るアクションを設定できます。

Advanced Scene Switcher でキー入力設定

この例は Ctrl + F11 を送る設定になってます。これを利用して

  • Ctrl + F11 の入力があったとき、Puppet3 の Alt + 7 のショートカットキーを叩く(通常カスタマイズに戻す用)
  • Ctrl + F12 の入力があったとき、Puppet3 の Alt + 8 のショートカットキーを叩く(笑顔用カスタマイズに変更する用)

の2つができるスクリプトを書いてみることにします。

ホットキーの説明ページから Ctrl を表す記号は ^ であり、Alt を表す記号は ! であることが分かります。これと ControlSend, DetectHiddenWindows の使い方を合わせて、以下のようなスクリプトを書けばOKです。

^F11::
DetectHiddenWindows,On
ControlSend,,!7,Puppet3G
return

^F12::
DetectHiddenWindows,On
ControlSend,,!8,Puppet3G
return

^F11 や !7 や Puppet3G などとなっている部分をお好みのキーやアプリケーション名に変更することでお好みの用途に合わせて使えます。

では、こちらのスクリプトの作成方法ですが、AutoHotkey のインストールが済んでいる場合、スクリプトを作成したい場所で右クリック>新規作成から「AutoHotkey Script」というのが選べるようになっているかと思われます。

AutoHotkey Script が作れそう

お好みのファイル名で作成して、そのファイルの上でさらに右クリックをして「Edit Script」を選択してみましょう。

Edit Script を選択

これでスクリプトの編集ができる画面が表示されるので、上にのせたスクリプト例をそのままコピーして貼り付けたり書き換えたりなどして保存しましょう。

AutoHotkey のスクリプトを実行

スクリプト実行の方法で簡単なのは2つあり

  • 実行したいスクリプトの上でダブルクリック
  • 実行したいスクリプトの上で右クリックしたのち「Run Script」を選択
Run Script を選択

でOKです。実行したときに特に反応もないので本当に実行できてるかどうか不安になりますが、そのときにもう一度ダブルクリックや Run Script を選択することで以下のような画面が出てくる場合は実行に成功してます。はい、いいえ、どちらでもいいので閉じてあげましょう。

もうスクリプト実行してあるけど、実行しなおすかい?的なことを言ってくれていますね。

これで、特定のキー入力があったときに裏のアプリケーションにキー入力を飛ばせる状態になりました。動作確認などやってみて想像通り動くかどうか試してみてください。

終わりに

以上、バックグラウンドのアプリケーションにキー入力を送ってみる話でした。

完全な余談ですが、自分がよく配信している beatmania IIDX INFINITAS は音ゲーであるというそのゲームの性質上、アプリケーションの起動中に自動でのキー入力をほとんどさせないよう制御しているようです。(チートの可能性がありますからね…)
そんな中、F12キーだけはどうやら反応しそうだという抜け道を見つけたので、そこから Puppet3 にキー入力を送るようにしています。なので、この記事で紹介したような F11 キーを使う手順は実は INFINITAS においては使うことができません。では筆者はどうやって実現してるかという話はもし機会があればいつか書くかもしれません。

最後までお読みいただき、ありがとうございました。

コメント

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