[ 新規に投稿する ]

独自メニューバーとAutoHotKeyの相性についてNo.41267
くまkz さん 24/06/02 18:01 [ コメントを投稿する ]
  このたび、V8.99.4からV9.34にバージョンアップした浦島太郎です。
おかしなことを言っていたら申し訳ないのですが、少々お付き合いください。

バージョンアップ後、秀丸が謎の挙動を示すようになりました。
Alt+Fでファイルメニューが開かなくなったり、Alt+Vは開いても特定の動作をしたり…
裏でAutoHotkeyによるショートカットスクリプトが常駐しており、これが一番クサいと思いまして調査しました。

元々のスクリプトの量がかなり多いので苦労しましたが、結局この現象の元凶は
*NumpadDown::Send, {NumPad2}
のたった1行でした。
NumpadDownは物理的にはテンキーの「2」でNumLockがOFFの場合のキーコードです。
この1行を抜くだけで、Alt+ショートカットのすべてが正常に動作するようになりました。
他の行は特に問題を引き起こさないようですので、
この行だけに絞ってAlt+ショートカットキーの挙動を調査しました。

(1)
*NumpadDown::Send, {Space}
Sendするキーを変えても同じでした(一瞬だけメニューが表示されているように見えます)

(2)
*NumpadDown::Send, {Blind}{NumPad2}
頭に*を入れる(どの修飾キーと押しても反応)ときは、そのまま押している修飾キーを素通りさせる{Blind}をよく入れますが、今回はこれを入れると
Alt+Vでタブモードになります
Alt+Sは開きますがすぐに閉じてカーソルが下部に移動します

(3)
*NumpadDown::Return
キーをSendしない場合は何も現象は発生しません

(4)
NumpadDown::Send, {NumPad2}
修飾キー(Alt含む)を一切見ず、NumpadDownのみが押下された場合に限定するとこの現象は発生しません

ちなみにこの現象が起きるのは秀丸(V9.34,V9.35b7で確認)だけで、他のアプリや秀丸の旧バージョン(V8.99.4)では発生しません。

おそらくVer9以降で実装された独自メニューバー絡みではないかと思いますが「メニュー項目をテキストのみにする」をONにしても変化はありませんでした。
(2)の挙動からすると、本来入力されるはずがない「↓」が入っている感じがします。

かなり特殊な環境で大変申し訳ないのですが、原因として何か考えられるものがありますでしょうか?
[ ]
RE:41267 補足調査No.41268
くまkz さん 24/06/02 20:11 [ コメントを投稿する ]
  こちらのスクリプトは一切なしの状態でキーボードフックを使ってさらに調査しました。

秀丸(V9.34&9.35b7)において、Alt+ショートカットキーを押すと、なぜか「NumpadDown」のDownとUpイベントが必ず入ることがわかりました。

これにより、私が作成したAutoHotkeyスクリプトのNumpadDownの部分が反応して、NumPad2を送信したりするため誤動作を引き起こしているようです。
なお、他のアプリ(メモ帳やWordやタスクマネージャなど)や、昔の秀丸(V8.99.4)ではAlt+ショートカットキーを押しても「NumpadDown」は一切記録されませんでした。

この動作は別のPCでも全く同じであることを確認しましたので、いわゆる「おま環」ではないと思われます。
[ ]
RE:41268 補足調査No.41270
秀丸担当 さん 24/06/03 09:51 [ コメントを投稿する ]
  いただいた情報から見ると、おそらく最近のバージョンでメニューバーが独自になってから起きていることかと思います。
メニューバーは独自でも、出てくるメニューはWindows標準のポップアップメニューです。
通常、Windows標準のポップアップメニューは一番上の項目が選択されないので、下矢印キーを押したことにして選択しています。
AutoHotKeyがテンキーと判断されるのはわかりませんが、Altキーが押されている関係でしょうか。
この手法はメニューを選択させる方法が無さそうなのでそうしていて、常駐秀丸エディタや、ユーザーメニュー各種でも以前からしている手法でした。
一番上を選択させる方法は無いと思っているのですが、もしかしたら自分が知らないだけで選択させる方法があるかもしれず、ご存知でしたらわかると助かります。
[ ]
RE:41270 補足調査No.41271
くまkz さん 24/06/03 20:40 [ コメントを投稿する ]
  ご返事ありがとうございます。
>通常、Windows標準のポップアップメニューは一番上の項目が選択されないので、下矢印キーを押したことにして選択しています。
申し訳ありませんが、私の日本語読解力が不足しているのか不明瞭なところがありましたので再度確認させてください。
Edgeでもメモ帳でも、Alt+Fで特に下矢印キーは送信されていないように見えますが、一番上の項目は選択されています。
秀丸エディタが独自メニューバーに変更された際に、下矢印キーを送信するようになったということでしょうか?

>AutoHotKeyがテンキーと判断されるのはわかりませんが、Altキーが押されている関係でしょうか。
秀丸内部で送っているキーは通常のカーソルキーの下(AutoHotKeyでいうところのDown)ということでよろしかったですか?
これをなぜAutoHotKeyがテンキーのNumPadDownとして受け取るのかは、かなり調べましたがさすがにわかりませんでした。
タイミング的には、秀丸でAlt+ショートカットキーを押した瞬間にAutoHotKeyがNumPadDownを受け取ります。
NumPadDown受け取り時には必ずAltキーは押されている状態ですので、NumPadDown単独押しにしか反応しない(4)が処理されないことは確認できました。
(釈迦に説法、自明なことですが一応書かせていただきました)

>一番上を選択させる方法は無いと思っているのですが、もしかしたら自分が知らないだけで選択させる方法
私はいわゆる「サンデープログラマー」なので、とてもご指南できるようなスキルはございません。

私のようなプログラミングスキルの人間には非常に強力な助っ人「ChatGPT」に以下のように聞いてみました。
「独自に実装したメニューバーから、WindowsのポップアップメニューをAlt+ショートカットキーで開くとメニューが開くだけですが、一番上の項目を選択状態にするにはどのような方法が考えられるか。現在は下矢印キーを送信することで実現しているが、キー送信ではない方法があれば教えてほしい」
返ってきた答えは、具体的なC++のコードと説明でしたが、大まかには
・ポップアップメニューのハンドルを取得
・一番上の項目のハンドルを取得
・一番上の項目を選択状態に設定して送信
といった感じではないかと思います。

C#は多少やりますが、C++は難しすぎて全くわかりません。
ChatGPTに投げた質問の文章自体が間違っていたら申し訳ないのですが、私にできることはこの程度かと。
駄文失礼いたしました。
[ ]
RE:41271 補足調査No.41272
秀丸担当 さん 24/06/04 14:41 [ コメントを投稿する ]
  >秀丸エディタが独自メニューバーに変更された際に、下矢印キーを送信するようにな
>ったということでしょうか?

はい。通常のWindows標準のメニューバーは自動的に一番上が選択されますが、いわゆるポップアップメニュー単体はそうではないので、下矢印キーを送信するようになったということです。

>秀丸内部で送っているキーは通常のカーソルキーの下(AutoHotKeyでいうところの
>Down)ということでよろしかったですか?

秀丸エディタ内部で送っているキーは、通常のカーソルキー下のつもりでいました。
Win32API的に言うと、VK_DOWNでkeybd_eventまたはSendInputの仮想キーコード指定です。
KEYEVENTF_EXTENDEDKEYとかは指定していなかったのですが、指定なしのときがテンキーの矢印キーで、指定ありのときが通常のカーソルキーのようでした。
Altキーは関係ありせんでした。失礼しました。
次のβ版で指定ありにしてみようと思います。
[ ]
RE:41272 ありがとうございますNo.41273
くまkz さん 24/06/04 19:47 [ コメントを投稿する ]
  >KEYEVENTF_EXTENDEDKEYとかは指定していなかったのですが、指定なしのときがテンキーの矢印キーで、指定ありのときが通常のカーソルキーのようでした。
>次のβ版で指定ありにしてみようと思います。

なるほど了解です。

AutoHotkey使いからすると、テンキー(NumPad)のほうはNumLockがOFFでもONでも数字を飛ばすようにしている私のような人は結構いますが、カーソルキーの下(Down)単独にホットキーを割り付けている人は多分いないので、通常のカーソルキー下に変更しても新たな問題は発生しないと思われます。

無変換+↓でPgDownにしている人はよく見かけますが、単独指定だとカーソルキーがそもそも使えなくなってしまいますからね。

たまにvi使いの人が、修飾キー+h,j,k,lをカーソルキーに見立てて割り付けている例も…なんて言い出したらキリがないですし、そんな方でもさすがにカーソルキーを完全に殺すような割り付けをしているとは考えづらいです。
[ ]
RE:41273 ありがとうございますNo.41274
くまkz さん 24/06/06 20:50 [ コメントを投稿する ]
  9.35Beta8にて、カーソルキー下の送信に変わっていることをキーボードフックで確認しました。

実際のAutoHotkeyスクリプトを走らせても、秀丸エディタの誤動作はなくなりました。

早々のご対応ありがとうございました。
[ ]
RE:41274 独自メニューの文字位置についてNo.41303
くまkz さん 24/06/28 02:22 [ コメントを投稿する ]
  新規スレッドにしようか迷いましたが少しだけ関連があるので続きで投稿します。

実にくだらないことなので申し訳ないのですが、秀丸エディタの独自メニューバーの文字(ファイル(F)とか)の位置が、Windows標準のメニューバーと比べると、少しズレているのが無性に気になります。

神経質過ぎだ!とか言われそうで、正直書くのも恥ずかしいのですが、Windows標準メニューバーではセンタリングされているように見えますが、秀丸エディタの独自メニューバーは左寄せ?されているように感じます。

これはわざとそのように実装しているのか、そうせざるを得ないのか、それとも私の目がおかしいのか、実際のところ私にはさっぱりわかりません。

もし何か情報がありましたら教えてください。
[ ]
RE:41303 独自メニューの文字位置についてNo.41304
秀丸担当 さん 24/06/28 15:52 [ コメントを投稿する ]
  独自メニューは実際はWindowsのツールバーになっています。
テキストだけのツールバーの既定の位置がそうなっていたので、そのままでした。
自分は気にしていなかったのですが、ファイル(F)が左に寄りすぎという意見もあったので、一項目内でセンタリングするように今後のバージョンで修正します。
[ ]
RE:41304 独自メニューの文字位置についてNo.41305
くまkz さん 24/06/28 16:45 [ コメントを投稿する ]
  早々のご返事ありがとうございます。

>独自メニューは実際はWindowsのツールバーになっています。
ツールバーを文字だけで構成して実現しているということですか。描画とかどうやってるのかなと思ってましたが、標準の機能で実装すれば確かに安全ですよね。その発想には至らなかったです。

>自分は気にしていなかったのですが、ファイル(F)が左に寄りすぎという意見もあったので、一項目内でセンタリングするように今後のバージョンで修正します。
申し訳ありませんが、またよろしくお願いします。
[ ]
RE:41305 対応ありがとうございましたNo.41307
くまkz さん 24/07/04 22:08 [ コメントを投稿する ]
  メニューバーのセンタリングの件、9.35正式版で対応いただきありがとうございました。
[ ]

[ 新規に投稿する ]