|
> 何回もgrepを実施して、多くなっている時に、今見ているgrep結果を1つだけ残
>して、他のgrep結果は閉じたいのですが、マクロでできますでしょうか。
それを実現するにはFindWindowExまたはGetNextWindow + GetClassName、および、
GetCurrentThreadIdやGetWindowThreadIdなどのAPI呼び出しが必要でして、現状のtk
info.dlにそれらのバイパス関数は、ヘルプを見た限りはありませんが・・・、ヘル
プには書いてないですが、実はこっそり追加していたりします。
その隠し関数を使うと実現できます。以下のマクロになりました。検索結果のウィ
ンドウ上で実行するマクロになります。
loaddll "tkinfo.dll";
#currentwnd = hidemaruhandle(0);
#currentthread = dllfunc("Bypass_GetCurrentThreadId");
//message "thread = " + str(#currentthread);
#wnd = dllfunc("Bypass_FindWindowEx", 0, 0, "#32770", 0);
while( #wnd != 0 ) {
//message hex(#wnd);
if( #wnd != #currentwnd ) {
#thread2 = dllfunc("Bypass_GetWindowThreadId", #wnd);
//message "#thread2 = " + str(#thread2);
if( #thread2 == #currentthread ) {
$title = dllfuncstr("Bypass_GetWindowText", #wnd);
//message $title;
if( leftstr( $title, 11 ) == "検索結果 - "
|| leftstr( $title, 19 ) == "中断されました! - "
) {
#n = dllfunc("Bypass_PostMessage", #wnd, 0x111, 2, 0 );
//IDCANCEL
}
} else {
//message "別スレッド";
}
}
#wnd = dllfunc("Bypass_FindWindowEx", 0, #wnd, "#32770", 0);
}
> nexthidemaru
> は、使えるんでしょうか?
> 「次の検索結果のウィンドウ」的なものがないでしょうか?
マクロでやるとしたら、上記の作戦でウィンドウハンドルの一覧を作ってsetactiv
ehidemaruすればいいです。
nexthidemaruだとこうなりました。
-------------------------------------------------------
loaddll "tkinfo.dll";
#currentwnd = hidemaruhandle(0);
#currentthread = dllfunc("Bypass_GetCurrentThreadId");
//message "thread = " + str(#currentthread);
#wnd = dllfunc("Bypass_FindWindowEx", 0, 0, "#32770", 0);
#count = 0;
while( #wnd != 0 ) {
//message hex(#wnd);
if( #wnd != #currentwnd ) {
#thread2 = dllfunc("Bypass_GetWindowThreadId", #wnd);
//message "#thread2 = " + str(#thread2);
if( #thread2 == #currentthread ) {
$title = dllfuncstr("Bypass_GetWindowText", #wnd);
//message $title;
if( leftstr( $title, 11 ) == "検索結果 - "
|| leftstr( $title, 19 ) == "中断されました! - "
) {
#greplist[#count] = #wnd;
#count = #count + 1;
}
} else {
//message "別スレッド";
}
}
#wnd = dllfunc("Bypass_FindWindowEx", 0, #wnd, "#32770", 0);
}
if( #count >= 1 ) {
//setactivehidemaru #greplist[#count-1]; はうまく動かない。
#n = dllfunc("Bypass_SetForegroundWindow", #greplist[#count-1] );
endmacro; //すぐにマクロ終了する他は何もできません。
}
|
|