検索して一覧を閉じるNo.43950
YK さん 13/01/14 17:39
 
いつも便利に使っています。
要望があり投稿させていただきました。

現在のベータ版は、検索して一覧作成を最大4つまで開くことが可能と
なっていますが、残す一覧と残さない一覧をマクロで管理したいです。
マクロを使って一覧を閉じる方法は有りますか。ご教示お願いします。
"GrepWnd"でウィンドウハンドルを調べて、"closehidemaru"は試しま
したが、うまくいきませんでした。

本件がすでにどこかでコメントまたは記述されている問題でしたら、
すみません。
以上、よろしくお願いします。

[ ]
RE:43950 検索して一覧を閉じるNo.43954
秀まるお2 さん 13/01/15 11:06
 
 まず、検索結果のウィンドウをマクロで閉じる方法はヘルプには書いてません
でした。

 閉じるやり方ですが…、状況によって2種類の方法を使い分ける必要があるよ
うです。

 状況というのは、つまり、マクロをどこで実行してる状況かによります。例え
ば検索結果のウィンドウ上でマクロが実行されてる場合、ウィンドウを閉じるこ
とで、マクロを実行してる秀丸エディタ相当ウィンドウも無くなることになりま
す。それを正常に成功させるには、例えば以下のように、WM_CLOSEをPostしてや
る作戦でないとダメです。

    loaddll "tkinfo.dll";
    #wnd = dllfunc("GrepWnd");
    if( #wnd != 0 ) {
        #n = dllfunc( "Bypass_PostMessage", #wnd, 0x0010, 0, 0 );
    }

 このやり方は万能で使えますが、PostMessageしたら、即座にマクロを終わら
せる必要があります。

 もしも検索結果ウィンドウを閉じた後も何か別の処理をやりたい場合は、
Bypass_PostMessageじゃなくてsendmessageを使う必要があります。

    loaddll "tkinfo.dll";
    #wnd = dllfunc("GrepWnd");
    if( #wnd != 0 ) {
        #n = sendmessage( #wnd, 0x0010, 0, 0 );
    }

 ただし、この場合、sendmessageで閉じる相手が自分自身(マクロを実行して
る秀丸自身)だと後々動作がおかしくなります。なので、もしも自分自身を閉じ
たいのであれば、例えば

    loaddll "tkinfo.dll";
    #wnd = dllfunc("GrepWnd");
    #n = dllfunc("SetMainWndTop");
    if( #wnd != 0 ) {
        #n = sendmessage( #wnd, 0x0010, 0, 0 );
    }

 のように、マクロの実行を秀丸メール本体ウィンドウに移動してからWM_CLOSE
をsendするって処理にしないといけないです。

 お勧めは前者の方法になります。ヘルプには前者の方法だけ書こうかと思いま
す。

 ちょっとややこしいですが現状こういうやり方になってしまいます。

 それと…、現状では、検索結果のウィンドウが複数あったとしても、GrepWnd
関数で得られるウィンドウハンドルは、あくまで一番手前の検索結果ウィンドウ
だけになります。他の検索結果ウィンドウもうまくコントロールしたいってこと
になると、関数のパラメータを拡張するなり、GrepWndCountとかの別関数を追加
しないとダメかと思います。もし必要でしたらその辺も追加してもいいです。

[ ]
RE:43954 検索して一覧を閉じるNo.43979
YK さん 13/01/16 23:36
 
お忙しいところ、ご回答いただきありがとうございました。
教えていただいた方法で、ウィンドウは閉じることができました。
ただし以下のマクロで試したところ、期待通り動きませんでした。
恐縮ですが、アドバイスいただけないでしょうか。
やりたいことは、このマクロを秀丸メール本体で動作させ、最近一週間に受信
したウィンドウを開きたいです。次にこのマクロを動作させたときには、
(このマクロ以外で開いたウィンドウは閉じずに)このマクロで開いたものを
閉じてから、新しいウィンドウを開きたいです。
以上、よろしくお願いします。


//目的:このマクロで作成した一覧は、既存ウィンドウを閉じて、新たに開きたい。
//秀丸メール本体で実行する
//#test=0の場合は、既存ウィンドウが閉じない
//#test=1の場合は、既存ウィンドウは閉じるが、新規ウィンドウにおいてメール内
容表示が固定となる
//確認は、Win7、Ver6.10 Beta 24


loaddll "TKInfo.dll";

openreg "CURRENTUSER", "Software\\Hidemaruo\\Hidemaru\\Env";
$MacroPathFld = getregstr( "MacroPath" );
if ($MacroPathFld=="") $MacroPathFld = hidemarudir;
closereg;


// #test=0;
 #test=1;

#wnd=0;
#wnd= getininum ($MacroPathFld+"\\"+"GrepWindowTest.ini", "SearchWindow", "N
ewMail");
//このウィンドウが未だ開かれていることの確認方法?

if( #wnd != 0 ) {
// #n = dllfunc("SetMainWndTop");
 if (#test) message str(#wnd);
// #n = dllfunc( "Bypass_PostMessage", #wnd, 0x0010, 0, 0 );
 #n = sendmessage( #wnd, 0x0010, 0, 0 );
    if (#test) message str(result);
}

#n = dllfunc("SetFindPack", "flag=!send&transmit=1週間前-指定なし, subfolder
=1, inmail=2, hilight=0" );
#n = dllfunc("DoGrep", dllfuncstr( "CurrentAccount" ), "受信+送信済み+ユー
ザー");


#wnd = dllfunc("GrepWnd");
writeininum $MacroPathFld+"\\"+"GrepWindowTest.ini", "SearchWindow", "NewMai
l", #wnd;
if (#test) message str(#wnd);

#n = dllfunc( "SetGrepWndTop" );

endmacro;

[ ]
RE:43979 検索して一覧を閉じるNo.43987
秀まるお2 さん 13/01/17 11:33
 
 テストしてみたら、たしかにうまく閉じないようでした。sendmessageで
WM_CLOSEを送っても、その直後にマクロが動作し続けるとダメみたいでした。

 一回メッセージループを回してやらないと閉じないようです。大変失礼しまし
た。

 とりあえず、無理矢理な作戦になりますが、以下のようにしたら一応動きまし
た。

loaddll "tkinfo.dll";
#wnd = dllfunc("GrepWnd");
if( #wnd != 0 ) {
    #n = sendmessage( #wnd, 0x0010, 0, 0 );
    #n = dllfunc("SetAutoPushTimer", 0, "");
    message "テスト";
}
#n = dllfunc("SetFindPack"
  , "flag=!send&transmit=1週間前-指定なし, subfolder=1, inmail=2, hilight=0" );
#n = dllfunc("DoGrep"
     , dllfuncstr( "CurrentAccount" ), "受信+送信済み+ユーザー");


 っと直してみつつ、改めて考えてみたんですが、そもそも以前のDoGrepでは自
動的に検索結果を閉じてから実行する作りになってたのが、V6.10βになって仕
様変更されたような形になってしまってるような気がします。これは互換性の維
持という意味ではまずいような気がします。

 なので、DoGrepはあくまで「検索結果がすでにあったら自動的に閉じてから実
行する」って仕様に戻した上で、別途、既存の検索結果を閉じずに追加で検索す
る用の、DoGrep2/StartDoGrep2関数か何かを追加した方がいいような気がします。
また、それとは別に、CloseGrepWnd関数なんかもあったらいいかなぁと思います。

 そういう方向で修正しますので、とりあえず次のβ版からは、マクロの方は昔
のまま(検索結果ウィンドウを閉じる処理は無し)に戻していただいて大丈夫な
いようになる予定ということでお願いします。

 (マクロでご苦労させてしまって申し訳ないですが)

[ ]
RE:43987 検索して一覧を閉じるNo.43990
秀まるお2 さん 13/01/17 13:30
 
 追加ですみません。

    #n = sendmessage( #wnd, 0x0010, 0, 0 );

 のやり方じゃなくて、WM_COMMANDでIDCANCELを送るやり方だとうまくいくよう
ではありました。

    #n = sendmessage( #wnd, 0x0111, 2, 0 );     //IDCANCEL

 どっちにしても、DoGrepは検索結果ウィンドウを自動で閉じてから実行する仕
様に戻させていただきます。

[ ]
RE:43990 検索して一覧を閉じるNo.43999
YK さん 13/01/17 22:45
 
いろいろご検討いただきありがとうございました。了解しました。
あと少し思ったのは、新着リストコマンドで検索して一覧を参照しているかたも従来
と同じように使えるように、開く数を選択できるオプションと、開く数以上に一覧が
増えたときに確認メッセージなしで閉じるオプションが有るほうが良いように思いま
した。
(開く数を1として、確認メッセージなしで閉じるオプションを選択すれば、従来と
同じに使える)
以上、よろしくお願いします。

[ ]
RE:43999 検索して一覧を閉じるNo.44003
秀まるお2 さん 13/01/18 10:46
 
 たしかに、正式版として出したタイミングで「従来の方かよかった」って意見
が必ず出てきそうな気がします。

 あんまりオプションばっかり増えるのもなんなので、従来と同じにする用のオ
プション1つだけ用意しようかと思います。

 「上級者向け・その他・その他3」に追加予定とさせていただきます。

[ ]