検索フォルダを表示中に送受信すると検索No.11867
yamakazu さん 23/10/12 13:51
 
秀丸メールの検索フォルダを便利に使わせて貰っています。

検索フォルダを開いている時に、定期受信(手動の場合でも)が動いて
メールの送受信を行うと、検索フォルダのメールリストが消えて空白になりますが、
これはそういう仕様でしょうか?

尚、設定で「検索フォルダの内容をリアルタイムに更新する」にチェックを入れてい
ますが、これがオフの場合でも動きは同じ様です。


希望としては送受信しても、検索フォルダのリストは空白にならずに、
元のリストのまま表示される(もしくはリアルタイムに再検索して更新される)
という事なのですが、それは設定などで可能でしょうか。

過去ログを少し調べたつもりですが、該当する質問が見つけられませんでした。
お手数ですが、教えて頂ければ幸いです。

[ ]
RE:11867 検索フォルダを表示中に送受信すNo.11868
秀まるお2 さん 23/10/12 14:51
 
 検索フォルダを選択してそこの一覧表示してる最中に受信コマンドを実行しても、
一応、検索フォルダの中身というか、そこのメール一覧が真っ白になるのはおかしい
です。今ちょっとテストした限りは、少なくとも僕の所では起きないです。

 検索フォルダのメール一覧の作成の最中に何かメールを受信したら、タイミングに
よっては検索フォルダのメール一覧作成が中断する可能性はあると思います。しかし、
一覧が完成した後なら関係ないと思います。

 1つ考えられる可能性として、「マクロ・マクロ登録...」の「自動起動」ページ
の、特に「送受信の開始直前」や「受信が一段落した時」に何かマクロ登録されて、
そのマクロのせいで検索フォルダが無効化されることはあるかと思います。自動起動
されるマクロの中でSelectFolder関数を使うとダメなことがあります。

 もしSelectFolder関数を使ってる場合は、マクロの先頭の「loaddll "tkinfo.dll
";」の後に

    #n = dllfunc("SetGrepFolderAutoInvalidate", 0);

 を入れればいいです。

 その辺どうでしょうか。

[ ]
RE:11868 検索フォルダを表示中に送受信すNo.11869
yamakazu さん 23/10/12 15:49
 
早速にありがとうございます。
ご指摘の通り、ビンゴ!でした。

「マクロ自動起動」の「受信が一段落した時」に
「重複メールの削除マクロ」というのを入れています。
それを外すと、問題なく「真っ白になる」は現象はなくなりました。
ありがとうございます。

次に、以下のことを試しました。

> もしSelectFolder関数を使ってる場合は、マクロの先頭の「loaddll "tkinfo.dll
>";」の後に
>    #n = dllfunc("SetGrepFolderAutoInvalidate", 0);
> を入れればいいです。

そうしたところ、メールのリスト欄は真っ白にならずに保持されましたが、
メールの中身を表示している欄が真っ白になるという現象が生じました。

具体的なマクロを下に貼り付けます。
もし、何か手を入れてクリア出来るならご教示頂ければ幸いです。

--------------------
// 重複メールの削除マクロ //

loaddll "tkinfo.dll";
#n = dllfunc("SetGrepFolderAutoInvalidate", 0);

// ↑の行を追加しました

$account = dllfuncstr("CurrentAccount");
$folder = dllfuncstr("CurrentFolder");
#n = dllfunc("SelectFolder", "account1", "");
#n = dllfunc("CheckDuplication", "batch+under");
#n = dllfunc("SelectFolder", "account2", "");
#n = dllfunc("CheckDuplication", "batch+under");
#n = dllfunc("SelectFolder", "account3", "");
#n = dllfunc("CheckDuplication", "batch+under");
#n = dllfunc("SelectFolder", $account, $folder);
--------------------

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

[ ]
RE:11869 検索フォルダを表示中に送受信すNo.11870
秀まるお2 さん 23/10/12 17:53
 
 フォルダ切り替えでメールが非選択状態になってるんじゃないかと思います。「全
般的な設定・未読メールの閲覧・詳細」の中にある

    □ メールを非選択状態にする(点線で選択するのみ)

 がONだとそうなります。

 それがOFFで、さらには「以前選択してたメール」がONなら問題は起きないと思い
ます。

 とりあえず上記の「非選択状態にする」がONになってるだけなら、マクロでなんと
か回避可能です。

 SelectFolderを呼び出す前に、

    //「メールを非選択状態にする」のオプション書き換え?
    openreg "CURRENTUSER", @"Software\Hidemaruo\TuruKame\Config";
    #dontselect = getregnum("DontSelSF");
    if( #dontselect != 0 ) {
        writeregnum "DontSelSF", 0;
        #n = dllfunc("EnvChangedDanger");
    }

 のような処理を入れてオプションを無理矢理OFFにして、一連の処理が終わったら、

 if( #dontselect != 0 ) {
  writeregnum "DontSelSF", #dontselect;
  #n = dllfunc("EnvChangedDanger");
 }

 の処理をしてオプションを元に戻せばいいです。

 その作戦でどうでしょうか。

[ ]
RE:11870 検索フォルダを表示中に送受信すNo.11871
yamakazu さん 23/10/13 10:56
 
ありがとうございます。
マクロに書き加えて試してみました。

更に欲を言いますと、
「メールを非選択状態にする」のオプション書き換えの前に
選択していたメールを覚えておいて、
一連のマクロ処理が終了後に、覚えていたメールを表示する

ということはマクロに手を加えたら実現可能でしょうか?

素人の勝手な希望なので、
もし非現実的なら却下して下さい。
ここまでのところでも十二分に感謝ですので。


[ ]
RE:11871 検索フォルダを表示中に送受信すNo.11872
秀まるお2 さん 23/10/13 12:10
 
 以前選択してたメールを選択しなおすような処理は一応可能です。

 一覧表示の場合(スレッド表示じゃない場合)なら、MailIndex関数で位置を取得
して、SetMailIndexで復元できます。

 スレッド表示の場合はそれが出来ないのですが、メール一覧のリストボックスに対
してLB_GETCARETINDEX/LB_SETCURSELを使ってなんとかする作戦が可能なようです。
(今試したらうまく動いた)

 マクロのサンプル掲載します。


    loaddll "tkinfo.dll";
    #n = dllfunc("SetGrepFolderAutoInvalidate", 0);

    //「メールを非選択状態にする」のオプション書き換え?
//  openreg "CURRENTUSER", @"Software\Hidemaruo\TuruKame\Config";
//  #dontselect = getregnum("DontSelSF");
//  #selectunread = getregnum("AutoSelectUnread");
//  if( #dontselect != 0 || #selectunread != 0 ) {
//      writeregnum "DontSelSF", 0;
//      writeregnum "AutoSelectUnread", 0;
//      #n = dllfunc("EnvChangedDanger");
//  }

    //メールの位置取得
    #index = dllfunc("MailIndex");
    #listindex = -1;
    if( #index < 0 ) {
        #listwnd = dllfunc("TitleListWnd");
        if( #listwnd != 0 ) {
            #listindex = sendmessage( #listwnd, 0x019F, 0, 0 ); //LB_GETCARE
TINDEX
        }
    }


    $folder = dllfuncstr("CurrentFolder");
    #n = dllfunc("SelectFolder", "", "受信");
    #n = dllfunc("SelectFolder", "", $folder);

//  if( #dontselect != 0 || #selectunread != 0 ) {
//      writeregnum "DontSelSF", #dontselect;
//      writeregnum "AutoSelectUnread", #selectunread;
//      #n = dllfunc("EnvChangedDanger");
//  }

    //メールの位置復元
    if( #index >= 0 ) {
        #n = dllfunc("SetMailIndex", #index);
    } else if( #listindex >= 0 ) {
        message str(#listindex);
        #n = sendmessage( #listwnd, 0x0186, #listindex, 0 );        //LB_SET
CURSEL
    }

[ ]
RE:11872 検索フォルダを表示中に送受信すNo.11873
yamakazu さん 23/10/13 17:14
 
秀まるお2 様

完ペキでございます。希望通りの動きが実現できました。
本当にありがとうございます。感謝申し上げます。

[ ]
RE:11873 検索フォルダを表示中に送受信すNo.11874
yamakazu さん 23/10/13 17:24
 
完璧!と思ったのですが、申し訳ありません。
確認が漏れていました。スレッド表示の場合は、効かない様です。
スレッド表示の場合には「番号」がポップアップ画面に表示されました。

頂いた内容を織り込んだマクロを書き出します。
修正すべきところあれば、ご教示頂けませんでしょうか。
----------------------------------------
//  重複メールの削除マクロ //

    loaddll "tkinfo.dll";
    #n = dllfunc("SetGrepFolderAutoInvalidate", 0);

//  メールの位置取得 //
    #index = dllfunc("MailIndex");
    #listindex = -1;
    if( #index < 0 ) {
        #listwnd = dllfunc("TitleListWnd");
        if( #listwnd != 0 ) {
            #listindex = sendmessage( #listwnd, 0x019F, 0, 0 ); //LB_GETCARE
TINDEX
        }
    }
    $folder = dllfuncstr("CurrentFolder");
    #n = dllfunc("SelectFolder", "", "受信");
    #n = dllfunc("SelectFolder", "", $folder);


//  重複メールのチェック //
    $account = dllfuncstr("CurrentAccount");
    $folder = dllfuncstr("CurrentFolder");
    #n = dllfunc("SelectFolder", "account1", "");
    #n = dllfunc("CheckDuplication", "batch+under");
    #n = dllfunc("SelectFolder", "account2", "");
    #n = dllfunc("CheckDuplication", "batch+under");
    #n = dllfunc("SelectFolder", "account3", "");
    #n = dllfunc("CheckDuplication", "batch+under");
    #n = dllfunc("SelectFolder", $account, $folder);

//  メールの位置復元 //
    if( #index >= 0 ) {
        #n = dllfunc("SetMailIndex", #index);
    } else if( #listindex >= 0 ) {
        message str(#listindex);
        #n = sendmessage( #listwnd, 0x0186, #listindex, 0 );        //LB_SET
CURSEL
    }

----------------------------------------
以上です。
お手数をお掛けして申し訳ありませんが、よろしくお願いいたします。

[ ]
RE:11874 検索フォルダを表示中に送受信すNo.11875
秀まるお2 さん 23/10/13 22:18
 
 message文が余計でした。デバッグ用に入れたのがそのまま残ってしまいました。

 それだけ削除すれば大丈夫じゃないかと思います。僕の所では検索フォルダを選択
してスレッド表示にした状態でも一応うまく動いてると思います。ただ、もしかして
「重複メールのチェック」で検索フォルダの結果が変換してしまってるとしたら、別
のメールが選択されてしまう可能性はあります。検索フォルダの結果が変化するのに
も対応するとなると、かなり難しい処理(元のメールを探して、もし見つからなけれ
ば選択しないとかの処理)が必要になります。マクロでやるには荷が重いので、そこ
までのことはあきらめていただいた方がいいです。



    loaddll "tkinfo.dll";
    #n = dllfunc("SetGrepFolderAutoInvalidate", 0);

//  メールの位置取得 //
    #index = dllfunc("MailIndex");
    #listindex = -1;
    if( #index < 0 ) {
        #listwnd = dllfunc("TitleListWnd");
        if( #listwnd != 0 ) {
            #listindex = sendmessage( #listwnd, 0x019F, 0, 0 ); //LB_GETCARE
TINDEX
        }
    }
    $folder = dllfuncstr("CurrentFolder");
    #n = dllfunc("SelectFolder", "", "受信");
    #n = dllfunc("SelectFolder", "", $folder);


//  重複メールのチェック //
    $account = dllfuncstr("CurrentAccount");
    $folder = dllfuncstr("CurrentFolder");
    #n = dllfunc("SelectFolder", "account1", "");
    #n = dllfunc("CheckDuplication", "batch+under");
    #n = dllfunc("SelectFolder", "account2", "");
    #n = dllfunc("CheckDuplication", "batch+under");
    #n = dllfunc("SelectFolder", "account3", "");
    #n = dllfunc("CheckDuplication", "batch+under");
    #n = dllfunc("SelectFolder", $account, $folder);

//  メールの位置復元 //
    if( #index >= 0 ) {
        #n = dllfunc("SetMailIndex", #index);
    } else if( #listindex >= 0 ) {
        #n = sendmessage( #listwnd, 0x0186, #listindex, 0 );        //LB_SET
CURSEL
    }

[ ]
RE:11875 検索フォルダを表示中に送受信すNo.11877
yamakazu さん 23/10/14 15:57
 
ありがとうございました。
これを置いて使わせて頂くように致します。

感謝致します。

[ ]