1

AirMech というゲームがあります。マウス ボタンをコントロールとして (まだ) 認識しないので、実装されるまで AutoHotkey を使用して回避しようとしました。

#IfWinActive, AirMech
  XButton1::Send c

うまくいきませんでした。だから私は試してみましたSendGameが、SendPlay他のすべてもうまくいきませんでした。私はそれをググったところ、一部のゲームでは送信コマンドがまったく認識されないことがわかりました。

あきらめる前に、簡単なマッピングを試してみました。

#IfWinActive, AirMech
  XButton1::c

それは実際に働いた。

送信コマンドが機能しないことが予想されますが、後者は機能しますか? 他のアクション (たとえば、'c' と MsgBox) をトリガーしたい場合はどうすればよいですか?

4

1 に答える 1

1

AutoHotkey には、さまざまな方法でキーストロークを送信する機能があります (SendRaw / SendInput / SendPlay / SendEvent)。単純なキー::キーマッピングがどのようなアプローチを使用するのかはよくわかりませんが、そのうちの 1 つに違いありません。私の推測では、SendRaw、SendInput、SendPlay、または SendEvent のいずれかがkey :: keyと同じように機能すると思います。

また、#IfWinActive は、特にフルスクリーン ゲームでは、期待どおりに動作しないことがあります。そのため、私は通常、#IfWinActive を使用せずに AHK スクリプトをテストして、正しく動作していることを確認しています。機能したら、条件を導入します。


アップデート

http://www.autohotkey.com/docs/misc/Remap.htmから:

スクリプトが起動されると、各再マッピングがホットキーのペアに変換されます。たとえば、a::bを含むスクリプトには、実際には代わりに次の 2 つのホットキーが含まれています。

*a::
SetKeyDelay -1   ; If the destination key is a mouse button, SetMouseDelay is used instead.
Send {Blind}{b DownTemp}  ; DownTemp is like Down except that other Send commands in the script won't assume "b" should stay down during their Send.
return

*a up::
SetKeyDelay -1  ; See note below for why press-duration is not specified with either of these SetKeyDelays. If the destination key is a mouse button, SetMouseDelay is used instead.
Send {Blind}{b Up}
return

私のノート:

理由a::bは機能していると思いa::Send bますが、a::b がボタン ダウン ハンドラーとボタン アップ ハンドラーを 2 つの別々のマッピングに分割する方法が原因ではありません。ゲームのゲームループはおそらくゲームプレイ キーをポーリングして「キーダウン」状態を確認しますが、AHK がリピートを合成している場合、これは一貫して維持されません。a_down->b_down および a_up->b_up を再マッピングすると、おそらく AHK はキーを押したままにする動作をより正確にエミュレートします。これは、特定の方法でキーの状態をテストするプログラムにとって重要になる場合があります (GetAsyncKeyState?)。

マッピングのアスタリスクは、「追加の修飾子が押されていてもホットキーを発射する」ことを意味します。

于 2013-04-24T18:58:06.983 に答える