独自メニューバーと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+ショートカットキーを押すと、なぜか「NumpadDo
wn」のDownとUpイベントが必ず入ることがわかりました。

これにより、私が作成したAutoHotkeyスクリプトのNumpadDownの部分が反応して、Nu
mPad2を送信したりするため誤動作を引き起こしているようです。
なお、他のアプリ(メモ帳や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でいうところのDow
n)ということでよろしかったですか?
これをなぜAutoHotKeyがテンキーのNumPadDownとして受け取るのかは、かなり調べま
したがさすがにわかりませんでした。
タイミング的には、秀丸でAlt+ショートカットキーを押した瞬間にAutoHotKeyがNumP
adDownを受け取ります。
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正式版で対応いただきありがとうございまし
た。

[ ]