履歴の消去についてNo.08385
kurin さん 21/07/19 10:52
 
マクロでsendmessageを利用して履歴の消去のダイアログボックスを表示させており
ますが、消去アイテムのチェック(常に固定です)と消去ボタンのクリックまでをマ
クロで実行させることは可能でしょうか?

[ ]
RE:08385 履歴の消去についてNo.08386
秀まるお2 さん 21/07/19 11:31
 
 チェックボックスのON/OFFはちょっと出来なさそうですが、とりあえず、OKボタン
を押すまでならマクロで出来ます。

    loaddll "tkinfo.dll";
    #n = dllfunc("SetAutoPushTimerEver", hidemaruhandle(0), "" );
    #n = sendmessage( hidemaruhandle(0), 0x111, 40321, 0 );     //履歴の消去
コマンド
    #n = dllfunc("StopAutoPushTimer");

 みたいなマクロでできます。これでどうでしょうか。

 チェックボックスのON/OFFは、そこの設定のON/OFF状態の記憶されてるレジストり
の書き換え&EnvChangedDangerによる設定の読み込み直しの作戦で可能かと思います
ので、もし必要ならトライしてみてもいいです。

[ ]
RE:08386 履歴の消去についてNo.08387
kurin さん 21/07/19 15:54
 
試してみましたが、履歴の消去のダイアログが表示されたままで「消去!」のボタン
が押されません。
「消去!」ボタンはデフォルトボタンだと思いますが、その他のボタン("ok"や"can
cel"等)を引数に指定してもダイアログボックスが表示された状態で止まっています。

なお、チェックボックスの選択状態がレジストリに記録されているのであれば、そち
らのOnOffは必要ありません(固定状態での運用を意図しております)。

[ ]
RE:08387 履歴の消去についてNo.08388
秀まるお2 さん 21/07/19 16:26
 
 一応、僕の所では先ほどのマクロでうまくいくんですが、もう1つ別の作戦のマク
ロも作ってみました。

 これでどうでしょうか。うまくいく場合は「sleep 500」の所の500の数値をもっと
小さくしてもいいかと思いますけども。

    loaddll "tkinfo.dll";
    #main = hidemaruhandle(0);
    #n = dllfunc("NewMail");
    #n = dllfunc("Bypass_PostMessage", #main, 0x111, 40321, 0 );     //履歴
の消去コマンド
    sleep 500;
    #dlg = findwindow( "履歴の消去" );
    if( #dlg != 0 ) {
        #n = dllfunc("Bypass_PostMessage", #dlg, 0x111, 1, 0 );     //OKボタン
        quit;
    } else {
  message "失敗";
 }

[ ]
RE:08388 履歴の消去についてNo.08389
kurin さん 21/07/19 17:23
 
最初のマクロを単独で実行したところ、上手く行くことが判明しました。

しかし、最初のマクロは、エディタ起動時に自動起動に設定しておくとダイアログが
消えない(ボタンが押されない)という現象になるようです。

次のマクロは、自動起動に設定しても上手く動きましたが、一瞬新規メールが表示さ
れてしまうのが難点です。

また、履歴削除のダイアログが消えた後に、エディタ画面が後ろに引っ込んでメイン
画面が表に出てきてしまします。

この点の操作も可能なのでしょうか。

よろしくお願いいたします。

[ ]
RE:08389 履歴の消去についてNo.08390
秀まるお2 さん 21/07/19 18:28
 
 僕の作ったマクロは秀丸メール本体ウィンドウ上で実行する前提になっていました。

 エディタ・ウィンドウ上でも実行可能なように直してみました。これでどうでしょ
うか。

-----------------------------------------------------------------------
    loaddll "tkinfo.dll";
    #handle = hidemaruhandle(0);
    #main = dllfunc("MainWnd2");
    if( #handle == #main ) {
        //秀丸メール本体ウィンドウ上で実行した場合
        #n = dllfunc("SetAutoPushTimerEver", hidemaruhandle(0), "" );
        #n = sendmessage( hidemaruhandle(0), 0x111, 40321, 0 );     //履歴の
消去コマンド
        #n = dllfunc("StopAutoPushTimer");
    } else {
        //エディタ・ウィンドウ上の場合
        #n = dllfunc("Bypass_PostMessage", #main, 0x111, 40321, 0 );     //
履歴の消去コマンド
        #tick = tickcount;
        while(1) {
            #dlg = findwindow( "履歴の消去" );
            if( #dlg != 0 ) {
                #n = dllfunc("Bypass_PostMessage", #dlg, 0x111, 1, 0 );    
//OKボタン
                break;
            }
            if( tickcount - #tick > 1000 ) {
                message "履歴の消去ダイアログが見つかりません。";
                endmacro;
            }
        }
    }

[ ]
RE:08390 履歴の消去についてNo.08400
kurin さん 21/07/20 14:48
 
ありがとうございました、完全に意図した通りの動きとなっております。

なお、マクロ内容で質問があります。

@エディタ・ウィンドウ上で、sendmessageを用いずにBypass_PostMessageを使って
いるのは、フォーカスが移らないようにするためでしょうか。

Atickcount - #tick > 1000は、1000msec(1秒)待っても処理の遅延等とかで履歴
の消去ダイアログが表示されない場合にマクロを強制終了させているという理解でよ
ろしいでしょうか。

よろしくお願いいたします。

[ ]
RE:08400 履歴の消去についてNo.08401
秀まるお2 さん 21/07/20 16:50
 
> @エディタ・ウィンドウ上で、sendmessageを用いずにBypass_PostMessageを使っ
>ているのは、フォーカスが移らないようにするためでしょうか。

 この辺はかなり面倒な話になってしまうんですが、まず、sendmessageだと、コマ
ンドの実行が完了するまで帰ってこないです。それと、エディタ・ウィンドウと本体
ウィンドウは別スレッドになってるので、そもそも的ちスレッドをまたがってsendme
ssageするのがあまりよくない(場合によっては固まってしまう)など問題があります。

 今回のケースは別スレッドで実行されることをうまく利用してダイアログボックス
のOKボタンを押すような仕組みにしてるので、PostMessageしてfindwindowしてOKボ
タン押下をPostする、みたいな処理でうまくいってます。

> Atickcount - #tick > 1000は、1000msec(1秒)待っても処理の遅延等とかで履
>歴の消去ダイアログが表示されない場合にマクロを強制終了させているという理解
>でよろしいでしょうか。

 そういう処理になります。別にこの処理が無くてもマクロの強制終了は可能なので
いいのですけど、念のためということで入れました。

[ ]
RE:08401 履歴の消去についてNo.08402
kurin さん 21/07/21 11:52
 
ご回答ありがとうございました。
色々と勉強になります。
また、よろしくお願いいたします。

[ ]