keyhac icon indicating copy to clipboard operation
keyhac copied to clipboard

`keymap["W-S-Left"] = "W-C-A-Left"`で`W-C-A-Shift`のショートカットが発動する

Open hkcomori opened this issue 1 year ago • 5 comments

FancyZonesのホットキーを変更するために、以下の設定をしました。 この状態でW-S-Leftを押すと、W-C-A-Leftは発動しますが、同時に別のアプリのグローバルなホットキーW-C-A-Shift(修飾キー全押し)も発動してしまいます(いずれもアプリ側ではホットキーが変更できません)。 恐らく、変更前のS-が、変更後も生きて居るのだと思います。

keymap["W-S-Left"] = "W-C-A-Left"

何か回避策はございませんでしょうか?

例えば、AutoHotkeyでは{Blind}をつけることで、変更元の修飾キーをキャンセルできます。

#+Left:: Send("{Blind}#^!{Left}")

先頭にU-S-をつけてキャンセルを試みましたが、W-C-A-Leftは発動せず、W-C-A-Sだけ発動してしまいました(U-は全体を修飾している?)。

keymap["W-S-Left"] = "U-S-W-C-A-Left"

hkcomori avatar Jun 17 '23 14:06 hkcomori

@hkcomori さん、 この問題が起きるとき、"内部ログをON"にしたときに、どのようなログが出力されているでしょうか? また、"W-C-A-S" が発動するとのことですが、これは、Win-Ctrl-Alt-(アルファベットのS) という意味でしょうか?または、Win-Ctrl-Alt-Shiftでしょうか?

crftwr avatar Jun 19 '23 06:06 crftwr

@crftwr 様

内部ログは以下のとおりです。

IN  : D-LShift
TRU : D-LShift
IN  : D-LS-LWin
TRU : D-LS-LWin
IN  : D-LS-LW-Left
OUT : [KeyDown(162), KeyDown(164), KeyUp(160), Key(37), KeyDown(160), KeyUp(162), KeyUp(164)]
IN  : U-LS-LW-Left
TRU : U-LS-LW-Left
IN  : O-LS-LW-Left
IN  : U-LW-LShift
TRU : U-LW-LShift
IN  : U-LWin
TRU : U-LWin

OUTが左から順に実行されるとすれば、 KeyDown(162), KeyDown(164) までで Win-Ctrl-Alt-Shift が押下された状況ができあがります。

言葉足らずで申し訳ございません。 アルファベットの S ではなく、修飾キーだけのショートカットキー Win-Ctrl-Alt-Shift です。 具体的にはこちらで紹介されているものです。

hkcomori avatar Jun 19 '23 09:06 hkcomori

ありがとうございます。まずは状況が理解できました。

Keyhacは、モディファイアキーの状況を実際のものから指定されたものに変更するために、差分を見て、架空のキー押下、キーリリースを発行するのですが、キー押下の方が先に処理されるため、途中でWin-Ctrl-Alt-Shift が全て押されている状況ができているということですね。

ちなみに、キー押下を先に処理するのは、モディファイアキーが単体で押して離されたことにならないようにするためです。たとえば、Win-LeftCtrl-Left に変換する場合、Ctrlを押す前にWinが離されると、Winキーが単体で押して離されたことになり、Start メニューが開いてしまいます。モディファイアキー単体押しが特別な意味を持つのは、WinとAltなので、ShiftやCtrlは先に離したことにしても良いかもしれません。

検討します。

crftwr avatar Jun 19 '23 17:06 crftwr

ご検討ありがとうございます。 キー押下を優先している理由は理解しました。

setInput_Modifier のコードを拝見しましたが、キーリリースの前に Win と Alt の単体押しをキャンセルする処理が実装されています。 キャンセルの発動条件は、変換前後の修飾キーが以下の条件を満たすときになっています。

  • Altのみ → 修飾キーなし
  • Winのみ → 修飾キーなし

この発動条件を以下のように拡張すると、キーリリースを優先してもスタートメニューやメニューバーにフォーカスが移ることは無いと考えられます。

  • Altのみ → Altを含まない
  • Winのみ → Winを含まない

私の環境で実際に試したところ、ご指摘の問題を発生させることなく、本問題を解消できることが確認できました。

この変更内容を Pull Request させていただいてもよろしいでしょうか?

hkcomori avatar Jul 31 '23 15:07 hkcomori

Pull Request をお願いします。ありがとうございます。 ご提案の内容と現在の実装を確認させていただきます。

crftwr avatar Jul 31 '23 16:07 crftwr