ShowNotifyWnd のダイアログの内容表示No.03243
Imabeppu さん 18/04/21 12:15
 
Imabeppu です。
秀丸メール Ver.6.80 Beta 8 を使用しています。
マクロで ShowNotifyWnd を使用してみましたが、ダイアログの内容が表示されません。
数秒のマクロなのですが、ダイアログの中身が表示されないまま HideNotifyWnd を
迎えてしまいます。
例えば次のようなマクロです。

1: #n = dllfunc("ShowNotifyWnd", "TEST", "TEST");
2: //sleep 1000;
3: #i = 0;
4: while (#i < 10) {
5:   sleep 100;
6:   title "TEST: " + str(#i);
7:   #i = #i + 1;
8: }
9: #n = dllfunc("HideNotifyWnd");

ShowNotifyWnd の直後に sleep 1000 を入れてみると、高確率で表示されるようにな
りますが、表示されないときもありますし、表示されるのは1秒経過後なのでいまい
ちです。
ShowNotifyWnd の処理の中で UpdateWindow を呼び出すなどして、必ず表示されるよ
うにできないでしょうか。

[ ]
RE:03243 ShowNotifyWnd のダイアログの内No.03246
秀まるお2 さん 18/04/23 09:45
 
 テストしてみたらたしかにダイアログボックスの中身が描画されませんでした。

 詳しい事情を説明するのが非常に難しいのですが、ShowNotifyWndで表示されるウ
ィンドウが正しく動作するためには、いわゆるメッセージループというのが回る必要
がありまして、そのためには、秀丸メールがアイドリング状態、つまり、何も仕事を
してない状態になってる必要があります。マクロ実行の最中は秀丸メールはマクロを
実行することに集中してるので、その最中、例えばsleep文を実行してる最中は、ダ
イアログボックスがうまく動作しないです。

 とりあえず、手元のソースコードを少しいじって通知ウィンドウの中身だけはうま
く表示されるようにしましたが、sleep中にボタンを押したりしても何も効かないです。

 なので、今回のような目的にはちょっと使えないと思います。

 message文やBypass_MessageBox関数呼び出しと、あと、SetAutoPushTimerを組み合
わせる方法がいいんじゃないかと思います。

 1秒で自動で閉じるメッセージの例:

    loaddll "tkinfo.dll";
    #n = dllfunc("SetAutoPushTimer", 1, "");
    message "テスト";
    message "テスト終了";

[ ]
RE:03246 ShowNotifyWnd のダイアログの内No.03253
Imabeppu さん 18/04/23 13:41
 
Imabeppu です。

ShowNotifyWnd の処理の中で、UpdateWindow を呼び出して描画のメッセージを処理
させてもだめでしょうか。
それでもだめなら Invalidate + UpdateWindows でどうでしょう。

[ ]
RE:03253 ShowNotifyWnd のダイアログの内No.03256
秀まるお2 さん 18/04/23 13:56
 
 サイトー企画の斉藤秀夫です。

> Imabeppu です。
>
> ShowNotifyWnd の処理の中で、UpdateWindow を呼び出して描画のメッセージを処
>理させてもだめでしょうか。
> それでもだめなら Invalidate + UpdateWindows でどうでしょう。

 「とりあえず、手元のソースコードを少しいじって通知ウィンドウの中身だけはう
まく表示されるようにしましたが」ってのが、実はUpdateWindow呼び出しを入れてみ
たって話になります。

 期待してることが、ただ表示されればいいならそれで直ります。(次のβ版で)

[ ]
RE:03256 ShowNotifyWnd のダイアログの内No.03257
Imabeppu さん 18/04/23 14:05
 
Imabeppu です。

なるほど、そういうことですね。
ボタンが効かない点についてはそのままということですね。
了解です。
私としては、ダイアログが表示されれば問題ないです。

[ ]