マクロでスレッド開閉No.02802
teruteru さん 18/01/26 12:50
 
お世話になります.
秀丸メール便利に使わせて頂いており,動作のカスタマイズのために色々マクロを書
いているところです.

秀丸メールのマクロに関しての質問はここでよいでしょうか.

実現したい動作は,カーソルキー左をメール一覧(スレッド表示)で押したときに,

・普通は「前のページ」
・スレッドの元にいて,メールの最初が表示された状態の時は「スレッドをたたむ」

みたいな感じです.要は,カーソルキーでメールを移動しながら,スレッドの開閉も
するみたいな.

で,秀丸メールのマクロヘルプから「スレッドを畳む/広げる」みたいな関数を探し
たのですが,見つかりませんでした.ありますでしょうか?
# 秀丸エディタのマクロヘルプを見ていて,foldallみたいなのがあったので試して
みたら本文の文章が畳まれてしまいました

また,「NextPage2」とかだと,スクロールしなかった場合に0を返してくれるので末
尾判定ができますが,同様の「PrevPage2」は用意されていないようです.上記の,
もう上にスクロールできなかったときには,という条件判定をする方法はありますで
しょうか.

[ ]
RE:02802 マクロでスレッド開閉No.02807
秀まるお2 さん 18/01/26 13:59
 
 期待する動作は一応マクロで実現は可能ですが、左矢印キーへの割り当てにはちょ
っと問題があるかもしれません。

 とりあえず、左矢印キーに割り当てないのであれば、マクロの例としては以下のよ
うになります。

    loaddll "tkinfo.dll";
    if( dllfunc("IsThreadView") != 1 ) {
        //message "スレッド表示じゃない。";
        goto Label_PrevPage;
    }
    #level = dllfunc("GetThreadLevel");
    if( #level != 0 ) {
        //message "スレッドの根元じゃない";
        goto Label_PrevPage;
    }
    #collapse = dllfunc("GetThreadCollapse");
    if( #collapse != 2 ) {
        //message "折りたたまれてる。または子が無い。";
        goto Label_PrevPage;
    }
    #listwnd = dllfunc("TitleListWnd");
    #n = dllfunc("SimulateKeyStroke2", #listwnd, 0x25, 0, 0, 0);
                                        //0x25 ... 左矢印キー、VK_LEFT
    endmacro;

Label_PrevPage: ;
    #listwnd = dllfunc("TitleListWnd");
    #n = dllfunc("SimulateKeyStroke2", #listwnd, 0x21, 0, 0, 0);
                                        //0x21 ... PrevPage、VK_PRIOR
    endmacro;

----------------------------------------------------
 左矢印キーに割り当てるとしたら、例えばメール一覧枠の中では上記マクロでいい
ですが、メール内容枠の中とかフォルダ枠の中では普通に左矢印キーとして動作しな
いといけないです。それが難しいと思います。

 一応、以下のマクロで大丈夫な気がするんですが、ダメなケースがあるかもしれま
せん。

    loaddll "tkinfo.dll";
    if( dllfunc("CurrentPane2") != 1 ) {
        //メール一覧枠じゃない場合
        #n = dllfunc("SimulateKeyStroke", 0x25, 0, 0 );
        endmacro;
    }
    if( dllfunc("IsThreadView") != 1 ) {
        //message "スレッド表示じゃない。";
        goto Label_PrevPage;
    }
    #level = dllfunc("GetThreadLevel");
    if( #level != 0 ) {
        //message "スレッドの根元じゃない";
        goto Label_PrevPage;
    }
    #collapse = dllfunc("GetThreadCollapse");
    if( #collapse != 2 ) {
        //message "折りたたまれてる。または子が無い。";
        goto Label_PrevPage;
    }
    #listwnd = dllfunc("TitleListWnd");
    #n = dllfunc("SimulateKeyStroke2", #listwnd, 0x25, 0, 0, 0);
                                        //0x25 ... 左矢印キー、VK_LEFT
    endmacro;

Label_PrevPage: ;
    #listwnd = dllfunc("TitleListWnd");
    #n = dllfunc("SimulateKeyStroke2", #listwnd, 0x21, 0, 0, 0);
                                        //0x21 ... PrevPage、VK_PRIOR
    endmacro;

[ ]
RE:02807 マクロでスレッド開閉No.02810
teruteru さん 18/01/26 14:24
 
早速ありがとうございます!

なるほど,直接関数があるのではなくて,キーシミュレートで実現すれば良いのです
ね・・.気づきませんでした.また,私自身がメール本文ウインドウでカーソルを1
つずつ移動させるようなことをしないので,下記問題も気にしていませんでした.

もともと,「上のページ(既読/未読関係なし)」を左カーソルに,「下のページ(既読
/未読関係なし)」を右カーソルに,それぞれ割り当てて使っていたのですが,スレッ
ドが開いているのが閉じれないし,閉じたスレッドを右カーソルで開ながら読むこと
もできないし,マクロでなんとかしよう,と思ったのでした.

ただ,これを左カーソルに割り当ててしまうと,
左カーソルを押す→マクロ実行→マクロ中で左カーソルが押される→マクロ実行→
 ・・・ みたいになってうまく動かなさそうです.
# 実際試してみても変な動きになります.

なので,左カーソルをキーシミュレートでではなく,直接的に「スレッドを畳む」方
法でないと,もともとしたかった動作は実現できなさそうです.ちょっと解決方法が
思い浮かばないので,無理そうであれば,左右カーソルでの運用はあきらめます.

例を作って頂いたのに申し訳ありません.
リアクション頂けて本当にありがたいです.

> 期待する動作は一応マクロで実現は可能ですが、左矢印キーへの割り当てにはち
>ょっと問題があるかもしれません。
> ......
>    endmacro;

[ ]
RE:02810 マクロでスレッド開閉No.02811
秀まるお2 さん 18/01/26 14:41
 
> ただ,これを左カーソルに割り当ててしまうと,
> 左カーソルを押す→マクロ実行→マクロ中で左カーソルが押される→マクロ実行→
> ・・・ みたいになってうまく動かなさそうです.
> # 実際試してみても変な動きになります.

 一応、僕の所ではうまく動いてますが・・・。

 SimulateKeyStroke2は、指定されたウィンドウに直接キー入力のメッセージをSend
Messageで送るだけなので、マクロが何回も繰り返し実行されることは無いはずで
す。???

 秀丸メールの方で、例えば「マクロ1」とかに先ほどのマクロを割り当てて、「設
定 - キー割り当て...」でマクロ1に対して左矢印キーを割り当てるというやり方で
すけども。

 dump.txtを取ると以下のようになります。(42001が「マクロ1」のコマンド)

14:40:22.336 (19525) Cmd 42001
14:40:22.336 (12879) ExecMacroFile test.mac
14:40:22.336 (12927) entered
14:40:22.336 (   0) ExecCommandMacroSub test.mac
14:40:22.336 (11461) FrameWnd:TKINFO 225
14:40:22.336 (3609) TKINFO 225
14:40:22.336 (11464) FrameWnd:TKINFO 225 return 00000001
14:40:22.336 (11461) FrameWnd:TKINFO 25
14:40:22.336 (3609) TKINFO 25
14:40:22.336 (11464) FrameWnd:TKINFO 25 return 00000001
14:40:22.336 (11461) FrameWnd:TKINFO 213
14:40:22.336 (3609) TKINFO 213
14:40:22.336 (11464) FrameWnd:TKINFO 213 return 00000000
14:40:22.336 (11461) FrameWnd:TKINFO 214
14:40:22.336 (3609) TKINFO 214
14:40:22.336 (11464) FrameWnd:TKINFO 214 return 00000002
14:40:22.336 (11461) FrameWnd:TKINFO 187
14:40:22.336 (3609) TKINFO 187
14:40:22.336 (11464) FrameWnd:TKINFO 187 return 00560452
14:40:22.336 (   0) CDdesub::Disconnect
14:40:22.336 (   0) CDdesub::Disconnect nothing to do
14:40:22.336 (12975) leave
14:40:22.336 (21525) 42001 ret 1

[ ]
RE:02811 マクロでスレッド開閉No.02812
teruteru さん 18/01/26 17:50
 
お手数をおかけして申し訳ありません.

奇妙な動作,と思っていたのは,メール一覧画面が1画面分上にスクロールしてしま
っていたということでした.メール本文画面が1画面上にスクロールして欲しいとこ
ろでした.

PrevPage のVirtual Keyを送っているところを,秀丸マクロの prevpage; に置き換
えたところ,希望の動作に近くなりました.ただ,prevpage だと,一番上の状態で,
一つ上のメールには移動してくれないっぽいので,キー割り当てで言う,「上のペー
ジ(既読/未読関係なし)」にあたる動作を行うキーがありましたらお教えいただける
とありがたいです.

また何か勘違いしていたらすいません.

>> ただ,これを左カーソルに割り当ててしまうと,
>> 左カーソルを押す→マクロ実行→マクロ中で左カーソルが押される→マクロ実行
>→ ・・・ みたいになってうまく動かなさそうです.
>> # 実際試してみても変な動きになります.
>
> 一応、僕の所ではうまく動いてますが・・・。
>
> SimulateKeyStroke2は、指定されたウィンドウに直接キー入力のメッセージをSen
>dMessageで送るだけなので、マクロが何回も繰り返し実行されることは無いはずで
>す。???
>
> 秀丸メールの方で、例えば「マクロ1」とかに先ほどのマクロを割り当てて、
>「設定 - キー割り当て...」でマクロ1に対して左矢印キーを割り当てるというや
>り方ですけども。
>
> dump.txtを取ると以下のようになります。(42001が「マクロ1」のコマンド)
>
>14:40:22.336 (19525) Cmd 42001
>14:40:22.336 (12879) ExecMacroFile test.mac
>14:40:22.336 (12927) entered
>14:40:22.336 (   0) ExecCommandMacroSub test.mac
>14:40:22.336 (11461) FrameWnd:TKINFO 225
>14:40:22.336 (3609) TKINFO 225
>14:40:22.336 (11464) FrameWnd:TKINFO 225 return 00000001
>14:40:22.336 (11461) FrameWnd:TKINFO 25
>14:40:22.336 (3609) TKINFO 25
>14:40:22.336 (11464) FrameWnd:TKINFO 25 return 00000001
>14:40:22.336 (11461) FrameWnd:TKINFO 213
>14:40:22.336 (3609) TKINFO 213
>14:40:22.336 (11464) FrameWnd:TKINFO 213 return 00000000
>14:40:22.336 (11461) FrameWnd:TKINFO 214
>14:40:22.336 (3609) TKINFO 214
>14:40:22.336 (11464) FrameWnd:TKINFO 214 return 00000002
>14:40:22.336 (11461) FrameWnd:TKINFO 187
>14:40:22.336 (3609) TKINFO 187
>14:40:22.336 (11464) FrameWnd:TKINFO 187 return 00560452
>14:40:22.336 (   0) CDdesub::Disconnect
>14:40:22.336 (   0) CDdesub::Disconnect nothing to do
>14:40:22.336 (12975) leave
>14:40:22.336 (21525) 42001 ret 1

[ ]
RE:02812 マクロでスレッド開閉No.02813
秀まるお2 さん 18/01/26 18:03
 
> 「上のページ(既読/未読関係なし)」にあたる動作を行うキーがありましたらお教
>えいただけるとありがたいです.

 普通のコマンドのコードは「マクロ - マクロ登録...」の「コマンド置き換え」の
中にある「コマンドの番号を調べる」で分かるんですが、これはメニューに無いコマ
ンドなので分からないようです。

 ソースコードを調べたら、

#define IDM_NEXT_PAGE                   40149
#define IDM_PREV_PAGE                   40150

 がありました。マクロとしては、

    #n = sendmessage(hidemaruhandle(0), 0x111, 40150, 0);

 でいけます。

[ ]
RE:02813 マクロでスレッド開閉No.02814
teruteru さん 18/01/26 18:16
 
ありがとうございます!

これでばっちり理想通りの動きになりました.
また,

>#define IDM_NEXT_PAGE                   40149

も提示して頂けたので,右カーソルキーに,
・畳まれた状態で右カーソルキーを押すと展開
・そうじゃないときは「下のページ(既読/未読関係なし)」
もできました!

ありがとうございました.

>> 「上のページ(既読/未読関係なし)」にあたる動作を行うキーがありましたらお教
>えいただけるとありがたいです.
> ......
> でいけます。

[ ]