マクロで検索実行後の履歴戻りがうまく動No.04279
ヒラメ さん 18/11/14 02:26
 
マクロによりメール検索を実行し、さらにマクロ内で履歴戻りを実行すると、予期し
ないメールに飛んでしまったり履歴戻りが動作しなかったりします。

末尾のマクロで実験しました。選択されているメールの1個下のメールを検索により
発見し、直後に履歴戻りにより検索前のメールを選択しなおすという動作を期待して
います。(この実験マクロでは、メール一覧末尾のメールを選択した状態でのマクロ
実行のケースは無視します。)

履歴戻りには何かの制限があったりするのでしょうか。

なお、Alt+VK_LEFT のシミュレートの場合、スレッドが折りたたまれるという動作が
起きることもありました。


秀丸メール Version 6.87 Beta 19 (64bit)
Windows 10 Home (October 2018 Update), 1809 (17763.55) (64bit)


loaddll "tkinfo.dll";
// 秀丸メールの検索パック復元予約
##n = dllfunc("AutoRestoreFindPack");
// 検索パック指定(Dateヘッダーから":"を検索する=下候補の実行で1個下のメー
ルが選択されるはず)
##n = dllfunc("SetFindPack", "(\":\", target=\"Date:\")and(\"\", casesense,
target=subject)and(\"\", target=smallheaderbody)and(\"\", target=smallheader
body), subfolder=0, inmail=0, hilight=0");
// 下候補
##n = dllfunc("FindDown");
// 履歴戻り(下候補実行前に選択されていたメールに戻るはず)
##n = sendmessage(hidemaruhandle(0),0x111,40206,0);
//##n = dllfunc("SimulateKeyStroke", 0x25, 0, 0, 1); //Alt+VK_LEFT
//##n = dllfunc("SimulateKeyStroke2", dllfunc("TitleListWnd"), 0x25, 0, 0, 1);

[ ]
RE:04279 マクロで検索実行後の履歴戻りがNo.04284
秀まるお2 さん 18/11/14 09:40
 
 履歴戻りがうまく動かない理由ですが、履歴戻りコマンドの不具合ではなくて、履
歴を記録する仕組みによる物のようでした。

 (この辺の仕組みについてはどこにも書いてないですが)

 履歴に記録するかどうかの仕組みですが、メールを選択したら必ず保存されるんじ
ゃなくて、実はメールを選択した後に「少し間」が必要になります。

 例えばFindDownの次に

   message "少し間";

 を入れると期待通り動作します。

 少し間が無いダメというのは、プログラミング的には、いわゆるメッセージループ
が回らないとダメってことになります。秀丸メールの処理の中で、メールを何か選択
したら、メッセージキューに「メールが選択された」ってメッセージをPostします。
メッセージループが回ってそのメッセージを受け取ると、そのタイミングで初めて履
歴に保存されます。

 ちょっとややこしい仕組みになってますが、人間的に「このメールを選択した」と
いうのと履歴を一致させるためにはこういう処理が必要になります。

 解決策ですが・・・

 tkinfo.dllに、"PushHistory"って関数を追加するとかで対応は可能です。

    ##n = dllfunc("FindDown");
    ##n = dllfunc("PushHistory");
    ##n = sendmessage(hidemaruhandle(0),0x111,40206,0);

 とやると、元のメールに戻る、みたいな動作になりますけども。

 そういう関数を追加するってことでどうでしょうか。
 (利用目的がいまいち分かりませんが)

> なお、Alt+VK_LEFT のシミュレートの場合、スレッドが折りたたまれるという動作
>が起きることもありました。

 これまたどこに書いてないことではありますが、キー入力がコマンドに変換される
仕組みの関係で、SimulateKeyStrokeがうまくコマンド実行に置き換わらないのは、
すみませんが仕方がないというか、仕様とさせてもらうしか無いです。

 キー入力をコマンドに置き換える処理も、これまたメッセージループの中というか、
GetMessage/DispatchMessageの中にあります。SimulateKeyStroke系関数はWM_KEYDOW
Nを直接フォーカスウィンドウにSendMessageするので、キー割り当ての変換の処理を
取らないです。

 PostMessageにすれば変換されますが、そうするとマクロが終わってから遅延して
キー入力されたような動作になってしまいます。

 これまたプログラミング的なディープな話になってしまうので理解いただくのは難
しいのですけども、すみませんが仕様にするしか無いです。

[ ]
RE:04284 マクロで検索実行後の履歴戻りがNo.04285
ヒラメ さん 18/11/14 09:54
 
一応仕様通りということで理解できました。先の実験マクロは内容無意味ですけど、
実際のマクロでは検索して見つかったメールに対して別の処理をする予定でして、そ
れで自然と解決するような気がします。

現状維持で大丈夫です。ありがとうございました。

[ ]
RE:04285 マクロで検索実行後の履歴戻りがNo.04288
秀まるお2 さん 18/11/14 10:20
 
 とりあえず、SimulateKeyStrokeについてはヘルプに「キー割り当て通りには動作
しない可能性が高い」みたいなコメントを追加させていただきます。

[ ]