A_MenuMaskKeyは、WindowsキーまたはAltキーのキーアップイベントのマスクに使用するキーを制御する組み込み変数です。
A_MenuMaskKeyで仮想キーコード(NN)とスキャンコード(NNN)を表すvkNNscNNN形式の文字列を取得または設定できます。空白の時は、マスクは無効になります。
スクリプトは、キー名、vkNNシーケンス、scNNNシーケンスを割り当てることもでき、この場合、一般にキーが送信されるまでVKまたはSCコードのどちらかがゼロのままとされ、その後自動的に決定されます。"vk00sc000"
を割り当てたときは、""
を割り当てたの同様にマスクが無効になります。
返される文字列は、どう割り当てられたかにかかわらず、有効な場合は常に vkNNscNNN の形式になり、無効な場合は空白になります。すべてのvkNNscNNN配列と、ゼロでないすべてのvkNNまたはscNNN配列が許容されるが、組み合わせによっては、メニューの抑制に失敗することがある。それ以外の無効なキーは、ValueErrorがスローされます。
初期値はvk11sc01D(左コントロールキー)です。
スタートメニューやアクティブウィンドウのメニューバーが予期せぬタイミングで起動しないように、マスクキーが自動送信されます。
この変数を使用すると、マスクキーを副作用の少ないキーに変更することができます。例えば、マイクロソフト社が「unassigned」と表記するvkE8や、「no mapping」(何の機能も持たないキー)という意味で予約されているvkFFなど、一般的に何の効果もない仮想キーコードが良い候補となります。VKがゼロでSCがゼロでないなど、一部の値ではスタートメニューの抑制に失敗することがあります。キーコードは、既存のキーと合わせる必要はありません。
注:マイクロソフトは、未使用のキーコードに機能を割り当てることがあります。例えば、かつてvk07は未定義で使っても問題ありませんでしたが、Windows 10 ビルド1909以降、ゲームバーを開くために予約されるようになりました。
この設定はグローバルであり、スクリプト全体の動作に影響を与えるために一度だけ指定する必要があることを意味します。
ホットキーについてキーボードフックやマウスフックを使ってホットキーを実装した場合、最終的なキー入力はアクティブウィンドウやシステムから見えない場合があります。もし、WinやAltのキーダウンとキーアップだけを検出し、その間にキー入力がなければ、通常はメニューを起動します。これを防ぐために、キーボードやマウスのフックが自動的にマスクキーを送信する場合があります。
フックホットキーを押すと、次のAltまたはWinのキーアップがマスクされるのは、以下の条件をすべて満たしている場合です:
$#a::
とAppsKey::RWin
の組み合わせでは、Menu+Aを押したときにマスクが発生しますが、Menu単体ではスタートメニューを開くことができます。マウスホットキーは、キーボードフックが装着されていない場合、マスクキーを即座に送信する場合があります。
チルダ修飾子を持つホットキーは、キーのネイティブ機能をブロックすることを目的としていないため、マスキングを引き起こすことはありません。Winが他のキーと組み合わせて使用されたことをシステムが検出するため、~#a::
のようなホットキーでもメニューは抑制されます。ただし、マウスのホットキーや両Win自身(~LWin::
、~RWin::
)は、スタートメニューを抑制しません。
スタートメニュー(またはアクティブウィンドウのメニューバー)は、任意のキーストロークを送信することで抑制することができます。次の例は、左Winでスタートメニューを起動する機能を無効にし、モディファイアとして使用できるようにしたものです:
~LWin::Send "{Blind}{vkE8}"
送信: Send、ControlSendと関連するものは、通常の操作の一部として修飾キーを解放することが多い。例えば、ホットキー<#a::SendText Address
は、通常、Addressの内容を送信する前に左Winを離し、送信後に左Winを押し戻す必要があります(他のWinキーの組み合わせが動作し続けるように)。このような場合、WinやAltのキーアップでメニューが起動しないように、マスクキーを送信することがあります。
See this archived forum thread for background information.
A_MenuMaskKey := "vkE8" ; マスキングキーをvkE8などの未割り当てのものに変更します。 #Space::Run A_ScriptDir ; 追加のCtrlキー操作は発生しません。