マクロ登録・コマンド置き換えダイアログボックス(Ver6.93対応版)
コマンド置き換えについての説明
 コマンド置き換えとは、秀丸メールのメニューバーやツールバーにならんでいるコマンドを、マクロに置き換えてしまう機能です。例えば「新規メール」コマンドを実行すると、普通はそのまま秀丸メールの新規メールコマンドを実行するのですが、ここの「コマンド置き換え」の指定をしておくと、新規メールコマンドを実行する代わりに指定されたマクロを実行することが出来ます。
 マクロの方では、例えば「新規メール」の場合なら、マクロからNewMail関数呼び出しをするなどして実際の「新規メール」相当の処理をさせることが出来ます。


注意
 コマンドの置き換えは、置き換えようとしてるコマンドの種類やマクロの内容によっては秀丸メールの動作がおかしくなる可能性があります。うまくいかない時は使わないでください。
 コマンドの置き換えを指定していても、マクロの中からコマンドが呼び出して実行される場合には置き換えが効かず、本来のコマンドの処理が実行されます。例えばマクロの中からsendmessageを使ってWM_COMMANDを送った場合は本来のコマンドの処理が実行されます。
ケース1:
 例えば40001のコマンド(新規メールコマンド)にtest.macを割り当てておいて、そのtest.macの中で、「#n = sendmessage(hidemaruhandle(0),0x111,40001,0);」、つまり、新規メールコマンドをsendmessageで実行しようとした場合、そのsendmessage自体はコマンド置き換えされず、普通の新規メールコマンドが実行されます。

ケース2:
 例えば40001のコマンドにtest.macを割り当ててある場合で、それとは別に、test2.macってマクロで「#n = sendmessage(hidemaruhandle(0),0x111,40001,0);」を実行するように指示されてた場合で、「マクロ」メニューからtest2.macを実行した場合、そのsendmessage自体もコマンド置き換えされず、普通の新規メールコマンドが実行されます。(Version 6.46β6まではエラー扱いでしたが、6.46β7からうまく置き換え無しで実行するようになりました。)


コマンドとマクロの指定方法
 コマンドとマクロの対応は、コマンドの番号とマクロファイル名をコンマで区切って指定する形になります。複数のコマンドを置き換えたい場合は改行で区切って複数行で指定します。
 コマンドの番号は、「コマンドの番号を調べる...」ボタンから探して調べてください。
 例えば「新規メール」は40001番、「返信メール」は「40019」となっています。
 例えば返信メールコマンドをtest.macの実行に置き換えたい場合は、
	40019,test.mac
 のように指定してください。

 補足:V6.23から、ウィンドウの「×」ボタンもマクロに置き換え可能になりました。


マクロの例
 例えば返信メールコマンドで、もしも現在選択してるメールのFrom:ヘッダが特定の人なら「全員に返信」とする例は、以下のようになります。
	loaddll "tkinfo.dll";
	$from = dllfuncstr("CurrentHeader", "From");
	$from = dllfuncstr("SetEmailOnly", $from);
	$from = dllfuncstr("ToLower", $from);
	if( $from == "maruo@mitene.or.jp" ) {
		#n = dllfunc("MakeReplyCustom", "All", "", "");
	} else {
		#n = dllfunc("MakeReply");
	}
 マクロの中の処理として、tkinfo.dllの関数呼び出しじゃなくて、元々のコマンドをそのまま実行させたいことがあります。その場合は、
	#n = sendmessage( hidemaruhandle(0), 0x111, コマンド番号, 0 );
 のようにすればいいですが、場合によってはこれでうまくいかない可能性もあります。なぜかというと、sendmessageで実行される処理が「今現在マクロ実行中かどうか」を判断して実行内容を変えるような処理になってることがあるかもしれないからです。その辺は秀丸メールの作者も予想が難しいので、うまくいかない場合は利用しないようお願いします。

 あと、補足としてですが、置き換えリストに入力出来る項目数自体には制限はありませんが、置き換えリストの文字列全体の長さについて、510バイト程度までの制限があります。あと、秀丸エディタのコマンドについては置き換え出来ません。秀丸メールのメニューに出てるコマンドで、コマンドコードが40000以上のコマンドに限って置き換え可能です。


tkinfo.dllの関数について
 「コマンド置き換え」の機能によってマクロが呼び出された場合、そのマクロからReasonMacroStarted関数を呼び出すと、11の値が返ってきます。
 さらに、コマンド置き換えで起動されたマクロからGetTransmitCommandCode関数を呼び出すと、置き換えられたコマンドのコードが取得出来ます。
例:
	loaddll "tkinfo.dll";
	message "ReasonMacroStartedの値は " + str( dllfunc("ReasonMacroStarted" ) ) + " です。\n\n" +
	        "GetTransmitCommandCodeの値は " + str( dllfunc("GetTransmitCommandCode" ) ) + " です。";