LockSelection, EnumSelection, UnlockSelection, SelectedMailCount関数(TKInfo.dll)(Ver7.22対応版)
 これらの関数は、複数のメールを選択している時に、その選択されたメール1つ1つに対してマクロで処理するために使います。

 複数選択しているメールを1つ1つ選択してマクロ処理させるには、まずLockSelectionを呼んで、次にEnumSelection関数が0を返すまでループし、最後にUnlockSelectionを呼ぶという手順になります。EnumSelection関数を1回呼ぶたびに、 複数選択していたメールを1つずつ選択していきます。

補足:
 これらの関数は、Version 6.10からは、検索結果の一覧上でも実行可能になりました。V6.01以下では秀丸メール本体ウィンドウ上でしかうまく動作しませんでした。
LockSelection関数
 LockSelection関数は、現在選択しているメールについての情報を取得し、次に呼ばれるEnumSelectionに備えます。
 LockSelection関数にはパラメータはありません。
 LockSelection関数の返り値は数値型で、選択しているメールの個数となります。0が返った場合はメールを何も選択していないことを意味し、1が返った場合は複数選択されてないことを意味します。


EnumSelection関数
 EnumSelection関数は、複数選択していたメール1つ1つを選択します。最初は一番上のメールを選択し、その次はその下のメール、…というように、上から下方向に選択していきます。
 EnumSelection関数には数値型のパラメータが1つあります。現在のバージョンではここには必ず1を指定してください。0を指定すると、選択する動作をせずに、値だけ返します。しかし、現状ではその返り値を有効利用することはできません。
 EnumSelection関数の返り値は数値型です。選択できるメールが無くなった場合は0を返します。選択しようとしたメールがメール一覧上に存在しなかった場合は-1を返します(普通そんなことはありえませんが、 たとえばLockSelectionした後にSetViewAreaを呼ぶとそういうことがありえます)。
 選択に成功した場合は0でも-1でも無く、何らかの値を返します。この値は秀丸メールの内部に持っているメールについての情報の先頭アドレスですが、現在の所、直接利用することはできません。
 スレッド表示の場合、選択されたスレッドの中で折りたたまれた物はすべて展開されてしまいます。



UnlockSelection関数
 UnlockSelection関数は、LockSelection関数が取得した内部データを解放すると同時に、パラメータの指定によっては元の選択状態を復元しようと努力します。
 パラメータ1は数値型で、ここに0を指定すると単純に内部データの解放のみを行います。1を指定すると、元の選択状態を復元しようと努力します。たとえば複数選択していたメールの1つでも削除されている場合はパラメータ1に1を指定しても復元されませんが、 メールが無くなってない場合は大抵うまく復元できるはずです。
 UnlockSelection関数の返り値は、パラメータ1に1を指定して選択状態の復元に成功した場合は1、そうでない場合は0を返します。
 UnlockSelection関数を呼ばずにマクロを終了しても、特に支障は無いはずです。でも念のために呼んでください。
 LockSelection関数が0を返した場合はUnlockSelectionを呼ばなくても全く支障ありません。


SelectedMailCount関数
 この関数は、現在選択されているメールの数を返します。


補足
 マクロの実行を少しでも速くしたい場合は、DisableDraw/EnableDraw関数を使ってください。
 LockSelectionした時点で選択されていたメールをEnumSelectionとは別の方法で選択して削除または移動すると、後でEnumSelectionした時に誤動作する恐れがあります。
 LockSelectionしてEnumSelectionのループをしている最中は、LockSelectionで選択しているメール以外のメールについてのみ、マクロから改変/削除/移動などの操作をしても大丈夫なはずです。選択しているメールについて操作したい場合は、 必ずEnumSelectionで選択させて動作させてください。


例(マーク状態を反転させる例)
loaddll "tkinfo.dll";
#count = dllfunc("SelectedMailCount");
if( #count == 0 ) {
    endmacro;
}
#n = dllfunc("LockSelection");
while(1) {
    #n = dllfunc("EnumSelection", 1);
    if( #n == 0 ) {
        break;
    }
    #n = dllfunc("SwitchMark");
}
#n = dllfunc("UnlockSelection", 1);
例(特定メールを削除する例)
loaddll "tkinfo.dll";
#count = dllfunc("SelectedMailCount");
if( #count == 0 ) {
    endmacro;
}
#n = dllfunc("LockSelection");
while(1) {
    #n = dllfunc("EnumSelection", 1);
    if( #n == 0 ) {
        break;
    }
    if( dllfuncstr("CurrentHeader", "Subject") == "削除せよ" ) {
        #n = dllfunc("Delete", 0);
    }
}
#n = dllfunc("UnlockSelection", 0);