裏マクロでキー入力が飛ばない原因と対策

   

裏マクロを作るページのコメント欄やメールで、「id,1なら動くけどid,2(裏マクロ)にすると動かない」といった質問が多く寄せられています。

個人的に裏マクロを使うことがないので気付きませんでしたが、特にメールでは具体的なコードと対象のゲーム名が書かれていたのでテストしたところ、確かに動作しません。
この原因と対策を検証・解析したので記事にします。

mouseorg関数の第二引数による挙動の違い

第二引数が1なら動くが2なら動かないということは、mouseorg関数自体、第二引数でキー送信のプロセスが違うと思われます。
(最初にメモ帳で検証してしまったために同じ現象が発生する別の問題でハマったがここでは割愛する)

まず第二引数が1の場合、UWSCはKBDなどのキー入力をSendInputで飛ばします。

次に第二引数が2の場合、UWSCはKBDなどのキー入力をPostMessageで飛ばします。
なぜキー送信方法が違うのかというと、SendInputではキーの送信先を指定することが出来ないからです。

PostMessage(2)でのみキー入力が飛ばない理由

DirectInputでキーを取っている主にゲームなどのプログラムは、PostMessageは効きません(受けられません)。
SendInputで送信する必要があります。

ですが、SendInputでは送信先を指定できないため裏マクロとして動作できません。

結論

mouseorg(id,2)でキーが飛ばないケースがあるのは仕様です。

例外として、例えばメモ帳のように子ウィンドウにPostMessageを送らないとキーが送れないものもあります。
ゲームではほぼ違うと思いますが、飛ばない場合は子ウィンドウを指定してみてください。

SendInputはcsrcc.exe内のデータにキーイベントを渡しているようなので、そのあたりに介入できれば解決の糸口が見えてくるかもしれません。
当サイトでは今のところ手をつける予定はありません

「もっと詳しく!」「こうできないの?」この記事に関連する質問や要望があればコメントで聞こう。

 - TIPS , ,