検索結果のウィンドウについてNo.43148
hirn さん 12/08/25 02:11
 
 マクロで DoGrep して、検索結果が 0 件ならそのウィンドウを閉じるようにする
ことはできるでしょうか?


<追記>
 マクロヘルプにおいて、GrepWnd の補足に GetGrepListWnd とありますが、GrepLi
stWnd ですね。

[ ]
RE:43148 検索結果のウィンドウについてNo.43149
秀まるお2 さん 12/08/25 22:12
 
 GetGrepListWndの間違いのご指摘ありがとうございます。さっそく修正させて
いただきます。

>  マクロで DoGrep して、検索結果が 0 件ならそのウィンドウを閉じるようにする
> ことはできるでしょうか?

 これはほとんど裏技なんですが、リストボックスにメッセージを送るやり方で
一応うまく出来ました。

 DoGrepした直後に

    #wnd = dllfunc("GrepListWnd");

 として、それでリストボックスのウィンドウハンドルを取得したら、その
ウィンドウに対して、LB_GETCOUNTってメッセージを送るとメール数が分かりま
す。LB_GETCOUNTのメッセージの値は0x018Bなので、

    #count = sendmessage( #wnd, 0x018B, 0, 0 );     //LB_GETCOUNT
    message "count = " + str(#count);

 のようにすると、リストボックスのアイテム数が分かります。

 それと、検索結果のウィンドウを閉じるのは、いろいろ試行錯誤したら、とり
あえず以下の方法でうまくいくことが分かりました。

    #wnd = dllfunc("GrepWnd");
    #n = dllfunc("SetMainWndTop");
    #n = sendmessage( #wnd, 0x0111, 2, 0 );

 0x0111はWM_COMMANDで、2というのは「IDCANCEL」、すなわちEscキーを押した
時に発生するメッセージを送ってることになります。

 "GrepWnd"で取得したウィンドウにいきなりIDCANCELを送信すると、マクロを
実行してる最中に秀丸相当のウィンドウ部品が存在しなくなってしまって保護違
反で落ちたりするのですが、上記のように、一度SetMainWndTopしてから送信す
れば正常に動作します。

サンプルマクロ:

    loaddll "tkinfo.dll";
    $s = input("検索文字列は?");
    $s = dllfuncstr("YenEncode", $s);
    #n = dllfunc("SetFindPack", "(\"" + $s + "\", target=subject), inmail=0");
    #n = dllfunc("DoGrep", "\\CurrentAccount", "受信", 0);
    #wnd = dllfunc("GrepListWnd");
    #n = dllfunc("SetGrepWndTop");
    #count = sendmessage( #wnd, 0x018B, 0, 0 );     //LB_GETCOUNT
    if( #count == 0 ) {
        #wnd = dllfunc("GrepWnd");
        #n = dllfunc("SetMainWndTop");
        #n = sendmessage( #wnd, 0x0111, 2, 0 );     //WM_COMMAND, IDCANCEL
    }

[ ]
RE:43149 検索結果のウィンドウについてNo.43196
hirn さん 12/08/30 22:39
 
 ありがとうございます。このサンプルマクロですが、
>    #n = dllfunc("SetGrepWndTop");
は不要な気がします。

 秀まるお2 さんのアイディアを拝借して、↓のようにしてみました。
このマクロは定期受信後に起動するようにしてあります。

loaddll "TKInfo.dll";

#n = dllfunc("SetQuietMode", 1);

#n = dllfunc("SetFindPack", "(\"重要|緊急\", regular, target=subject), flag=
unread, subfolder=1, inmail=0");
#n = dllfunc("DoGrepAppend", "", "受信");

#count = sendmessage( dllfunc("GrepListWnd"), 0x018B, 0, 0 ); //LB_GETCOUNT
if( #count == 0 ) {
 #n = sendmessage( dllfunc("GrepWnd"), 0x0111, 2, 0 ); //WM_COMMAND, IDCANCEL
}

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

[ ]