[ 新規に投稿する ]

マクロでスレッド開閉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は、指定されたウィンドウに直接キー入力のメッセージをSendMessageで送るだけなので、マクロが何回も繰り返し実行されることは無いはずです。???

 秀丸メールの方で、例えば「マクロ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は、指定されたウィンドウに直接キー入力のメッセージをSendMessageで送るだけなので、マクロが何回も繰り返し実行されることは無いはずです。???
>
> 秀丸メールの方で、例えば「マクロ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

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

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

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

[ 新規に投稿する ]