GREPの検索結果一覧で、マクロで日付順にNo.10282
styth さん 22/09/17 08:05
 
 GREPの検索結果一覧で、マクロで日付順にソートしたいのですが、

#n = dllfunc("SetSortMethod", 4+12);
 みたいなものが、見つけられませんでした。
 教えてください。よろしくお願いいたします。

[ ]
RE:10282 GREPの検索結果一覧で、マクロでNo.10287
秀まるお2 さん 22/09/20 09:03
 
 テストしてみた所、検索結果の一覧上でSetSothMethodは普通に使えました。

> #n = dllfunc("SetSortMethod", 4+12);

    loaddll "tkinfo.dll";
    #n = dllfunc("SetSortMethod", 4+12);

 ってマクロで僕の所ではうまく送受信日時の逆順ソートになりました。

 検索結果の一覧上で使えるかどうかについてはヘルプには書いてないですが・・・。
SetThreadView / GetThreadView その他いろいろ対応してるようです。

 ヘルプの方に、「検索結果一覧上でも使えます」みたいな文面を追加しようと思い
ます。対応してないのもまだあるんだろうと思うので、対応してるのだけ追加します。

[ ]
RE:10287 GREPの検索結果一覧で、nexthideNo.10291
styth さん 22/09/20 12:08
 
> テストしてみた所、検索結果の一覧上でSetSothMethodは普通に使えました。
 出来ました。

> ヘルプの方に、「検索結果一覧上でも使えます」みたいな文面を追加しようと思
>います。対応してないのもまだあるんだろうと思うので、対応してるのだけ追加し
>ます。
 よろしくお願いいたします。

 関連してなんですが、
 何回もgrepを実施して、多くなっている時に、今見ているgrep結果を1つだけ残し
て、他のgrep結果は閉じたいのですが、マクロでできますでしょうか。
 nexthidemaru
 は、使えるんでしょうか?
 「次の検索結果のウィンドウ」的なものがないでしょうか?

[ ]
RE:10291 GREPの検索結果一覧で、nexthideNo.10297
秀まるお2 さん 22/09/20 18:32
 
>  何回も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;       //すぐにマクロ終了する他は何もできません。
    }


[ ]
RE:10297 GREPの検索結果一覧で、nexthideNo.10306
styth さん 22/09/22 07:40
 
> その隠し関数を使うと実現できます。以下のマクロになりました。検索結果のウ
>ィンドウ上で実行するマクロになります。
 ありがとうございます。上手く行きました。

 ところで、
https://log.maruo.co.jp/hidesoft/hidesoft_8/x1906088.html#6088

 以前に教えて頂いたマクロと今回教えて頂いたマクロを合体させてみました。
 単体なら、
>  何回もgrepを実施して、多くなっている時に、今見ているgrep結果を1つだけ残
>して、他のgrep結果は閉じたいのですが、マクロでできますでしょうか。
 が上手く行きますが、
 合体版だと、後半のマクロで、今見ているgrep結果が閉じられてしまいます。
 どこを直せば良いか教えて頂いたいのですが、よろしくお願いいたします。

//-------------------------------------------------- https://www.maruo.co.j
p/hidesoft/8/x10282_.html#10297
    #grep = dllfunc("GrepWnd");
    if( #grep != 0 ) {
        //検索結果が存在する場合の処理
       
        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);
        }      
    } else {
        //検索結果が無い場合の処理
        if( hidemarucount == 1 ) {
            #n = dllfunc("Exit");
            endmacro;
        }
    }
//-------------------------------------------------- https://log.maruo.co.j
p/hidesoft/hidesoft_8/x1906088.html#6088
    loaddll "tkinfo.dll";
    #n = dllfunc( "SetMainWndTop" );    //追加
    #n = dllfunc("CloseGrepWnd", 1);
    #count = hidemarucount;
    if( #count > 1 ) {
        #closecount = 0;
        #main = dllfunc("MainWnd");
        #i = 1;
        setactivehidemaru hidemaruhandle(1);
        while( #i < #count ) {
            if( hidemaruhandle(0) == #main ) {
                //ここには来ないはず。念のため。
          //} else if( readonly ) {     //変更
            } else if( ! updated ) {
                //閉じる
                #wantclose[#closecount] = hidemaruhandle(0);
                #closecount = #closecount + 1;
            }
            #i = #i + 1;
            nexthidemaru;
        }
        setactivehidemaru #main;
        while( #closecount > 0 ) {
            #closecount = #closecount - 1;
            closehidemaru #wantclose[#closecount];
        }
    }

[ ]
RE:10306 GREPの検索結果一覧で、nexthideNo.10307
秀まるお2 さん 22/09/22 09:39
 
>  合体版だと、後半のマクロで、今見ているgrep結果が閉じられてしまいます。
>  どこを直せば良いか教えて頂いたいのですが、よろしくお願いいたします。

 テストした訳じゃないですが、

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

 って行があるのでそこで検索結果(の最前面の物1つ)が閉じてるんだと思います。
そこをコメントアウトしたらいいんじゃないかと思います。(動作確認はしてません
けど)

[ ]
RE:10307 execmacroで検索結果が1個になりNo.10309
styth さん 22/09/22 12:03
 
>テストした訳じゃないですが、
 少しテストしたら、また意図しない現象が起こりました。
(本来のテストとは違うかもしれませんが)

//マクロB
//今見ているgrep結果を1つだけ残して、他のgrep結果は閉じたい
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);
}
question "「メール本体以外を閉じる」を実行しますか?";
if ( ! result ) endmacro;
execmacro "A.mac";
endmacro


question "「メール本体以外を閉じる」を実行しますか?";
if ( ! result ) endmacro;

(1)
 この2行をコメントにして、マクロBを実行します。
 "A.mac"が、実行されます。検索結果が1個になりません。
(2)
 この2行をコメントにしないで、マクロBを実行します。questionが表示されます。
 この時、検索結果は1個です。

 ご確認お願い致します。

[ ]
RE:10309 execmacroで検索結果が1個になりNo.10310
秀まるお2 さん 22/09/22 12:18
 
 A.macの中身が分からないのでテストできませんけども。

 「message "A";」でもなんでもいいってことですかね?

[ ]
RE:10310 execmacroで検索結果が1個になりNo.10311
秀まるお2 さん 22/09/22 13:26
 
 A.macの中身は別にして、とりあえずマクロが期待通り動かない可能性がありそう
なことは分かりました。これもこの前あった話と同じで、Bypass_PostMessageでWM_C
OMMANDをPostしたら、その後速やかにマクロを終了しないとダメで、何か時間のかか
る処理をしてるとその間にWM_COMMANDが無くなってしまいます。

 一応、手元の秀丸メールではその辺改良してるので、何らかの処理があったとして
も、それが短時間であれば大丈夫です。

 とりあえず僕の手元のバージョンでないとテストにならないので、今日中にβ版ア
ップロードします。それで改めてテストしてみてほしいです。

--------------------------------------------
 他の検索結果を閉じる目的だけであれば、Bypas_PostMessageをsendmessageにして
も一応うまく動くようではありました。

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

 に直す形になります。

[ ]
RE:10297 GREPの検索結果一覧で、nexthideNo.10313
styth さん 22/09/23 07:29
 
7.15β8で、テストをやらせて頂いています。
その中で、以下のようなことが出来ないか、ご教授して頂きたいのですが。

「今見ているgrep結果を1つだけ残して、他のgrep結果は閉じたい」
ただし、
「今見ているgrep結果1個と本体だけの時は、今見ているgrep結果を閉じ本体だけ残
したい」
としたいのですが、マクロをどう変えれば良いでしょうか?よろしくお願いいたしま
す。

それと、「検索結果からの検索結果」ウィンドウというのもありましたので、

//          if( leftstr( $title, 11 ) == "検索結果 - "
            if( leftstr( $title, 8  ) == "検索結果"      //「検索結果からの
検索結果」に対応?

としました。これで良いでしょうか?


//「今見ているgrep結果を1つだけ残して、他のgrep結果は閉じたい」マクロ
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 ) == "検索結果 - "
            if( leftstr( $title, 8 ) == "検索結果"      //「検索結果からの検
索結果」に対応
             || leftstr( $title, 19 ) == "中断されました! - "
             ) {
                //#n = dllfunc("Bypass_PostMessage", #wnd, 0x111, 2, 0 );  
//IDCANCEL
                #n = sendmessage( #wnd, 0x111, 2, 0 );     //IDCANCEL
            }
        } else {
            //message "別スレッド";
        }
    }
    #wnd = dllfunc("Bypass_FindWindowEx", 0, #wnd, "#32770", 0);
}

[ ]
RE:10310 execmacroで検索結果が1個になりNo.10314
styth さん 22/09/23 07:31
 
> A.macの中身が分からないのでテストできませんけども。
 確かに、A.macが悪さをしている可能性がありました。

> 「message "A";」でもなんでもいいってことですかね?
 はい、そうです。
 A.macの中身が、何もマクロに影響を与えないものだったのですが、以後、気を付
けます。

[ ]
RE:10311 execmacroで検索結果が1個になりNo.10315
styth さん 22/09/23 07:41
 
 ヘルプには、
> そもそもこのやり方は裏技であり、sendmessageで確実に使えることの保証はあり
>ません。動作に不審な点があったら、そのコマンドについてはこの裏技でのやり方
>は使わないでください。
>裏技による任意コマンド実行
> sendmessageでコマンド実行するよりも、Bypass_PostMessageを使った方が確実に
>コマンド実行できる可能性が高いです。詳しくはそちらのヘルプを参照ください。
 との説明があります。

> 他の検索結果を閉じる目的だけであれば、Bypas_PostMessageをsendmessageにし
>ても一応うまく動くようではありました。
>                #n = sendmessage( #wnd, 0x111, 2, 0 );     //IDCANCEL
> に直す形になります。
 今回に限っては、sendmessageの方が良いということでしょうか?
 それとも、ヘルプの説明は、「コマンド実行」だけのことを言っているのでしょう
か?

[ ]
RE:10315 execmacroで検索結果が1個になりNo.10316
秀まるお2 さん 22/09/24 09:27
 
 SendMessageはいわゆるcall-returnで実行され、PostMessageはreturnした後のメ
ッセ−ジループで実行されるんですが、メッセージループとかの話が通じないと、そ
の辺理解してもらうのは無理かもしれません。そもそも的にWindowsのC++プログラミ
ングでの話になってしまうので。

 とりあえず、Bypass_PostMessageでWM_COMMANDを実行させる場合は、その後マクロ
は何もしないで終了させるのが原則になります。SendMessageで実行してうまく動く
かどうかも、実際にやってみてうまく動くかどうか、自分でテストしてみてもらうし
か無いです。うまくいくケースとうまくいかないケースを論理的に言葉で簡単に説明
することは、僕にはちょっと無理です。

[ ]
RE:10313 GREPの検索結果一覧で、nexthideNo.10323
秀まるお2 さん 22/09/27 10:54
 
 遅ればせながら、マクロは以下のようになりました。

    loaddll "tkinfo.dll";
    #currentwnd = hidemaruhandle(0);
    if( #currentwnd != dllfunc("GrepWnd") ) {
        message "このマクロは検索結果の一覧上で実行する用です。";
        endmacro;
    }
    #currentthread = dllfunc("Bypass_GetCurrentThreadId");
    //message "thread = " + str(#currentthread);
    #wnd = dllfunc("Bypass_FindWindowEx", 0, 0, "#32770", 0);
    #found = 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, 8 ) == "検索結果"
                 || leftstr( $title, 19 ) == "中断されました! - "
                 ) {
                    #n = sendmessage( #wnd, 0x111, 2, 0 );     //WM_COMMAND,
 IDCANCEL
                    #found = 1;
                }
            } else {
                //message "別スレッド";
            }
        }
        #wnd = dllfunc("Bypass_FindWindowEx", 0, #wnd, "#32770", 0);
    }
    if( #found == 0 ) {
        //検索結果を1つも閉じなかった場合
        #n = dllfunc("Bypass_PostMessage", #currentwnd, 0x111, 2, 0 );
    }

> それと、「検索結果からの検索結果」ウィンドウというのもありましたので、
>
> //          if( leftstr( $title, 11 ) == "検索結果 - "
>             if( leftstr( $title, 8  ) == "検索結果"      //「検索結果から
>の検索結果」に対応?
>
> としました。これで良いでしょうか?

 それで大丈夫のようです。

[ ]