Mery以外のタスクバーボタンをクリックしてもウィンドウが切り替わらない
-
Kuroさん、こんにちは。
Ver 3.5.5で追加された「メニューの項目を選択した状態からの右クリックでポップアップメニューを表示できる機能」について気になることがあったのでフォーラムに投稿いたしました。
例えば、メニューバーの「ツール」→「プラグイン」→「プラグインの設定」をクリックした後、「Outline」を選択した状態で「プロパティ」をクリックしてアウトラインウィンドウを出します。
この状態でMery以外のタスクバーボタンをクリックしてウィンドウを切り替えることができます。ですが、メニューバーの「ツール」→「プラグイン」→「アウトライン」を右クリックしてポップアップメニューを出した後、「プロパティ」を選択してアウトラインウィンドウを出してからタスクバー上のタスクバーボタンをクリックしても、クリックしたタスクバーボタンがオレンジ色に点滅するだけでウィンドウが切り替わりません。
多分、この時にMeryで何らかのロックがかかっているのかもしれません。前者と後者で動作が異なるので、どちらかに統一したほうが分かりやすいかと思います。
個人的には前者の動作のほうがロックがかからなくて好みです。なお、この現象はアウトライン以外にも「マクロ」→「カスタマイズ」を右クリック→「キーボード ショートカットの割り当て」など、メニューの項目を選択した状態からの右クリックで出現するポップアップメニューに表示されているものであれば発生します。
使用環境は下記の通りです。
【使用環境】
・Windows 10 Home 22H2(64ビット)
・Mery Ver 3.5.9 (64ビット)
・マクロ:なし
・プラグイン:アウトライン| MSY-07 | 返信 -
ご報告いただき、ありがとうございます。
現象を確認しました。
> 前者と後者で動作が異なるので、どちらかに統一したほうが分かりやすいかと思います。
この動作は、Mery 側で意図的に行っているものではありません。
Mery と同様に、右クリックでメニューの上にメニューを表示できる機能がある EmEditor さんでも同様の動作となっているようです。
そのため、Windows の仕様 (または不具合) が影響している可能性が考えられます。
現在、対策について調査中ですが、具体的な情報はまだ得られていない段階です。
引き続き調査を続けますので、もし手掛かりになりそうな情報をお持ちの方がいらっしゃいましたら、ご協力いただけると助かります。
| Kuro | 返信 -
引き続き、調査を進めている最中ですが、進捗を共有させていただきます。
調査を進めていく中で、Windows のポップアップ メニューが OS 自体の長年のバグとして、正常に消えない現象が報告されていることを確認しました。この問題が存在するため、タスクバーがロックされる現象が発生する可能性があります。
バグ回避の方法として以下のトリックが紹介されており、試してみた結果を共有いたします。
(1) WM_NULL を送信する方法
SetForegroundWindow(Handle); // display menu SendMessage(Handle, WM_NULL, 0, 0);
この方法は効果的で、タスクバーがロックされる現象を回避することができました。ただし、Delphi との相性による不安定な挙動が見受けられました。
(2) WM_CANCELMODE を送信する方法
SendMessage(Handle, WM_CANCELMODE, 0, 0);
こちらの方法も効果があり、タスクバーのロックを回避できました。しかし、この方法は 1 段階目のメニューを確実に閉じてしまうため、特定のケースでの利用に制約が生じます。
また、ChatGPT からの情報によると、TPM_RECURSE フラグの使用によって、一部の Windows バージョンでタスクバーがロックされるという報告があるようです。
【ChatGPT から引用】
TPM_RECURSE フラグは、コンテキストメニューが別のメニュー項目を選択した場合に再帰的にサブメニューを表示する際に使用されますが、このフラグを使うことで一部のバージョンの Windows でタスクバーがロックされるという報告がされているようです。(OpenAI, 2023)これを踏まえて、以下の対策が提案されました。
(1) TPM_RECURSE フラグの使用を避ける
→ メニューの上にメニューを表示する機能を使用しない。(2) 別の方法でサブメニューを表示する
→ Windows のメニューを使用せず、独自のメニューを作成する。(3) マイクロソフトへの報告
→ マイクロソフトにバグの修正を提案する。また、私自身が考えた方法として、以下の方法があります。
(1) 別スレッドでコマンドを実行
→ 効果はありましたが、予期しない不具合のリスクがあるかもしれません。(2) タイマーを使用してコマンドを遅延実行
→ メンテナンス性の低下につながる可能性があります。(3) キューを使用してコマンドを遅延実行
→ ある程度の安定性とメンテナンス性のバランスを保ちつつ遅延実行できる方法です。ただし、これらの方法も、OS のバージョンや環境によっては期待通りに動作しない可能性があるため、完全な解決策とは限りません。
現在のところ対策が難しい状況ですが、引き続き調査を進めています。時間がかかりすぎる場合は、対応が難しいこともあるかもしれませんので、ご了承くださいませ。
| Kuro | 返信 -
Ver 3.6.0で修正されたのを確認しました。
ありがとうございました。
| MSY-07 | 返信 -
ご確認ありがとうございます。
うまく動作しているようで、安心しました。
しかしながら、対症療法的なアプローチであり、Windows のアップデートなどによって対策がうまく機能しなくなる可能性も考えられます。
現象が再発した場合、その際に再検討いたしますので、ひとまずはこれで様子を見ていただければと思います。
| Kuro | 返信