ShowTip メソッドでテキストが表示されないときがある

  1. マクロで少し時間のかかる処理の前にツールチップを表示させて処理が終わったらツールチップを非表示にしようと思い ShowTip メソッドを使ったのですが、ツールチップは出るのに中のテキストが表示されない現象が起きました。

    この現象が起きるのは Mery を起動して1回目の実行だけで、以降 Mery を終了するまでは正常に動作するようです。

    [オプションを指定して実行] でも再現したので載せておきます。

    js9:ShowTip("しばらくお待ちください", meShowTipPosMouse);Sleep(1000);ShowTip("", meShowTipHide);
    

    Mery 起動直後に [オプションを指定して実行] で上記マクロを実行すると再現すると思います。


    Mery: 3.8.2 (x64)
    OS: Windows 11 (Version 25H2, OS Build 26200.7462, 64-bit Edition)

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

    どうやら Sleep が影響していそうですね。

    ツールチップは、Windows のウィンドウアニメーション機能を使って、ふわっと表示される仕組みになっています。

    そのため、ShowTip メソッドの直後に Sleep (またはループ処理など、アプリが一時的に固まる処理) が入っていると、Windows 側のアニメーション処理と競合してしまい、1 回目のツールチップが正しく表示されないことがあるようです。

    Windows のアニメーション機能を使用しているため、内部でどのような処理が行われているかは分かりませんが、初回表示時にアニメーション関連の準備処理が行われているのかもしれません。

    ちなみに、ShowTip("", meShowTipHide); の部分を削除すると、Sleep(1000); の処理後にツールチップの内容が表示されますね。

    この挙動は、EmEditor さんでも同様に確認できました (同期実行の場合)

    マクロの先頭に、

    #async = true
    

    を付けると、マクロが非同期実行になるため、Sleep 処理中でもツールチップの内容が表示されるようです。

    ただし、非同期にすると処理速度が少し落ちたり、処理中にほかの操作ができてしまうことで思わぬ影響が出る可能性もありますので、その点はご注意ください。

    また、このアニメーション表示は Windows 側の仕組みに依存しているため、根本的な解決はなかなか難しそうです。

    アニメーション機能を使わない、という対策も考えられますが、ShowTip だけでなくアプリ全体のツールチップ (ヒント表示) に影響してしまうため、現状では採用しづらいところですね。

    何かもう少し良い回避策がないか、引き続き検討してみたいと思います。

     |  Kuro  |  返信
  3. ご確認ありがとうございます。

    教えていただいた通り #async = true でツールチップの内容が表示されるようになりました。

    試したマクロでは影響は無さそうでしたが、少し不安だったので下記のように editor.ExecuteMacroShowTip だけ非同期で実行してみたところ、こちらの方法でもツールチップの内容が表示されるようになりました。

    editor.ExecuteMacro("ShowTip('しばらくお待ちください', meShowTipPosMouse);", meRunText | meMacroAsync);
    Sleep(1000);
    ShowTip("", meShowTipHide);
    

    > 何かもう少し良い回避策がないか、引き続き検討してみたいと思います。
    お手数をおかけしますがよろしくお願いします。

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