検索ダイアログ閉じると「常に手前に表示」ウィンドウからフォーカスが外れないか

  1. おま環の報告でしかないかもですが
    ・「常に手前に表示」ON/OFF混合で複数のウィンドウを用意します。
    ・ピン留めウィンドウから検索ダイアログを開いて閉じます(検索完了含むダイアログ破棄)。

    → ピン留めしてない方のMeryウィンドウへフォーカスが移りませんか?

    正確にはアクティブだった「常に手前に表示」ウィンドウへとフォーカスが戻ってきて欲しいのですが...最前面ウィンドウの検出から除外されてる?

    Mery: 3.7.17 (x64)
    OS: Windows 10 (Version 22H2, OS Build 19045.5965, 64-bit Edition)

     |  MM  |  返信
  2. ご報告ありがとうございます。

    こちらでも現象を確認しました。

    調べてみたところ、どうやらこれは Mery の開発環境である Delphi の仕様のようです。

    Delphi のソースコードには「直前にアクティブだったウィンドウにフォーカスを戻す」処理があり、その際に「最前面ウィンドウ」よりも「通常のウィンドウ」を優先する仕組みが組み込まれていました。

    試しに Delphi でまっさらなアプリを作り、同じ状況を再現してみたところ…やっぱり同じ現象が発生。(しかも最新版の Delphi でも直っていませんでした)

    ということで、開発環境の内部仕様に依存しているため、残念ながら根本的な解決は難しいのですが、何かしら回避できる方法を探してみたいと思います。

     |  Kuro  |  返信
  3. 確認ありがとうございます!
    おま環じゃなかったんですねー、Delphi面白いw どういうアプリを想定して設計したんだろう。

    ダイアログ開くときにアクティブウィンドウの記録して、ダイアログ閉じたときどっかのイベントで比較できないかなぁ。
    タイマーは仰々しいか。ダイアログから閉じる時記録しといたウィンドウに戻すよとイベント発行するとか?

    ダイアログ開いたままウィンドウ跨ぐし、めんどくさそうですねー。
    かと思ったけど、ウィンドウそれぞれで検索ダイアログ開けて、各ダイアログ検索は該当ウィンドウに固定されてるので。
    ダイアログはウィンドウと1:1ですね。

    最前面固定(常に手前に)を優先下位にしてるのは、そういうウィンドウ=ダイアログと見做し除外という設計思想か。
    アプリ開発者にこういうウィンドウクラスはと仕様書読ませるよりも統一的でシンプルか(勝手に納得)。

     |  MM  |  返信
  4. ご返信ありがとうございます。

    > おま環じゃなかったんですねー、Delphi面白いw どういうアプリを想定して設計したんだろう。

    ほんとですよね、謎すぎます…。気付かないまま 10 数年も使っていましたが、ご報告いただけて助かりました ^^;

    > ダイアログはウィンドウと1:1ですね。

    そうなんです。対策としては、検索ダイアログを閉じたときに、親ウィンドウにフォーカスを戻す処理を追加するしかなさそうで…。

    Delphi 側の処理を止められるわけではないので、一瞬だけ別のウィンドウがアクティブになってしまうかなと思ったのですが、試してみたら大丈夫そうでした。

    Delphi のソースコードを追ってみたら、ダイアログがアクティブな状態で閉じられた場合だけ「次にアクティブにするウィンドウ」を探す…、例の処理が走る仕様になっていました。

    なので、ダイアログが閉じられる直前に親ウィンドウをアクティブにしてしまえば、Delphi の内部処理を回避できそうです。

    > 最前面固定(常に手前に)を優先下位にしてるのは、そういうウィンドウ=ダイアログと見做し除外という設計思想か。

    その可能性は高いですね。

    常に手前のウィンドウって、ダイアログやツールパネル、カラーピッカーのような補助ウィンドウであることが多いので、あえて除外してメインウィンドウを探す…みたいな意図なのかもしれません。

    小さな親切、大きなお世話といった感じですがw

    次のバージョンでは対策できる見込みですので、もうしばらくお待ちくださいませ。

     |  Kuro  |  返信
  5. > Delphi のソースコードを追ってみたら、ダイアログがアクティブな状態で閉じられた場合だけ「次にアクティブにするウィンドウ」を探す…、例の処理が走る仕様になっていました。
    (略)
    > 常に手前のウィンドウって、ダイアログやツールパネル、カラーピッカーのような補助ウィンドウであることが多いので、あえて除外してメインウィンドウを探す…みたいな意図なのかもしれません。

    なるほど... 想像できますね。
    ツールなどの小窓がいっぱい開いてるようなペイントソフトとか。納得。

    > なので、ダイアログが閉じられる直前に親ウィンドウをアクティブにしてしまえば、Delphi の内部処理を回避できそうです。

    シンプルな対策で済みそうで良かったです。
    開発環境のソース読み込み=設計(フロー)が分かるような...ご苦労様ですorz

     |  MM  |  返信
スポンサーリンク