秀丸メールマクロヘルプ20
コマンド一覧
ExecAt関数は、スレッドをまたがってSendMessageすることで実現されているもので、もし、呼び出した先のスレッドが呼び出し元のスレッドに何か要求するような操作をすると、そこでデッドロック状態となり、秀丸メールが固まってしまいます。具体的には、NextUnread/PrevUnreadなど、メールの選択を切り替える関数や、その他、秀丸メールのウィンドウに何らかの変化をもたらせる関数物は一切使えません(スレッド間での排他制御をしようとして固まります)。
もしもデッドロックが発生して固まってしまった場合には、20秒後にエラーメッセージが表示されて復旧するように作ってあります。たたし、その後の秀丸メールの動作は不安定になる可能性が高いです。
実行対象のウィンドウハンドルを指定します。秀丸マクロのhidemaruhandleを使って取得したハンドルを指定するか、またはTKInfo.dllの"MainWnd"関数を使って得た秀丸メール本体ウィンドウのハンドルが指定できます。
実行したい関数名を指定します。
以降のパラメータ(数値型、文字列型不定)
実行したい関数についてのパラメータを追加で指定してください。
返り値は、関数の返り値そのままです。文字列型か数値型かはこの関数によって決まります。
EnvChanged関数は、秀丸メールの「全般的な設定」について、レジストリに保存された内容を読み込み直し、秀丸メール側に反映します。秀丸マクロのenvchanged文の秀丸メール版です。
全般的な設定は、秀丸マクロのopenreg/writeregstr/writeregnum/closereg文などを使って各自で書き換えてください。具体的にどこをどう書き換えればどこの設定が変わるのかについては、「全般的な設定」を変更してレジストリエディタで調べてください。
パラメータ1には0を指定するか、またはパラメータ1自体を省略してください。
パラメータ1に数値の1を指定すると、EnvChanged関数は、いわゆる「全般的な設定」とは別の、内部的な設定値も含めてレジストリの値をすべて読み込み直しをします。そういう内部的な値を秀丸メールに読み込み直しさせたいような特殊なことをする場合は、1を指定してください。
パラメータ1に数値の1を指定するようなケースでは、レジストリを書き換える前に、SaveConfig関数を呼んでおくことが必要になります。
返り値に意味はありません。
ウィンドウの座標など、一部の項目についてはレジストリを書き換えても秀丸メール側には反映されません。
レジストリを壊してしまうと秀丸メールの動作がおかしくなることがあるので、壊さないようご注意ください。特に、設定範囲外の値を書き込んだ場合の動作は保証されません。
「秀丸エディタの動作環境」について、読み込み直しを反映する場合は、秀丸マクロのenvchanged文を使用します。
SetAutoPushTimer, SetAutoPushTimerMilli関数は、メッセージボックスのボタンを一定時間後に押すためのタイマーをセットします。
例えば、「切断しますか?」のメッセージボックスを表示しつつ、ユーザーが何もしなかったら自動的に10秒後に「はい」ボタンを押させたい場合などに使います。
この関数を呼び出した後は、必ずメッセージボックスを表示する必要があります。メッセージボックスを表示しないままマクロを終了してもこのタイマーは生き続けてしまうので、後でメッセージボックス類が誤動作してしまいます。
この関数はダイアログボックスやその他一般のウィンドウについても使えてしまいます。ただし、ダイアログボックスの「OK」ボタンや「キャンセル」ボタンが標準的な「IDOK」や「IDCANCEL」といったIDで定義されていないとうまく動作しません。
何秒後にボタンを押すかの時間を指定します。SetAutoPushTimer関数の場合は秒単位、SetAutoPushTimerMilli関数の場合はミリ秒単位(1/1000秒単位)です。
押して欲しいボタンを指定します。以下の種類が指定できます。
返り値に意味はありません。
SetAutoPushTimerEver関数は、パラメータで指定されたウィンドウ配下に出てくるメッセージボックス/ダイアログボックスについて、すべて自動的にボタンを押してしまう動作をします。メッセージボックス/ダイアログボックス類による問い合わせが連続して出てくるようなケースで、それらをすべて自動処理させたい場合に使います。
自動処理の対象となるウィンドウのハンドルを指定します。普通、hidemaruhandle(0)を指定します。
押して欲しいボタンを指定します。SetAutoPushTimer関数と同じです。
押して欲しいボタンが存在しなかった場合は、IDOKのボタンを探して、もしそれがあればそれを対象とします。IDOKも無かった場合はIDCANCELが対象となります。
StopAutoPushTimer関数は、SetAutoPushTimer系関数でセットしたタイマーを止めます。
SetAutoPushTimer/SetAutoPushTimerMilli関数の場合は別に必要ありませんが、SetAutoPushTimerEver関数を呼び出した場合は、マクロを終了する前に、必ずこの関数を呼び出すようにしてください。でないとマクロを終了した後もタイマーが動作し続けてしまい、余計な警告メッセージ類まで自動的に処理されてしまう恐れがあります。
IsHidemaruMacroExecuting関数は、秀丸メール上でのマクロ実行ではなく、別に動作している秀丸エディタ上で現在マクロ実行中かどうかを返します。
IsHidemaruMailMacroExecuting関数は、逆に秀丸メール上で現在マクロ実行中かどうか返します。こちらについては秀丸エディタ側から呼び出されることを想定しています。
秀丸メールと秀丸エディタと連携して何かする場合に、相手側のソフトがマクロ実行中かどうか調べるのに使います。
これらの関数で「0」、すなわち「マクロ実行中でない」と返ったとしても、その後すぐマクロが実行されれば実際に相手側ソフトでのマクロ実行は失敗します。そういう物と理解して使ってください。
注意:この関数は、ソフトウェア名称の変更に伴って関数名が変更されています。ただし、昔の関数(IsTuruKameXXXX関数)もそのまま使えます。
パラメータはありません。
マクロ実行中の場合は1、そうでない場合(または相手側ソフトが起動してない場合)は0を返します。
秀丸エディタ側からtkinfo.dllの関数を呼び出すには、秀丸メールのレジストリから秀丸メールのインストールされたフォルダを調べる必要があります。具体的にはHKEY_CURRENT_USER\Software\Hidemaruo\TuruKame\ConfigのTuruKameDirキーを参照する必要があります。
SetQuietMode関数(TKInfo.dll)
SetQuietMode関数は、秀丸メールが何らかのウィンドウを表示しても、そのウィンドウをアクティブにしないで静かに動作させる指定をします。例えば定期受信の後に自動起動されるマクロから、NewMail関数を呼ぶなどすると、新規メール用のウィンドウが前面に出てきてしまって都合が悪いです。QuietModeをONにしておくと、生成されたウィンドウが一番裏に出てくる動作となり、パソコンの利用者が何か別の作業をしていてもじゃまにならずに済みます。
1を指定するとQuietModeがONとなり、0を指定すると普通の状態に戻ります。
QuietModeをONにしたら、マクロ終了前にQuietModeをOFFに戻してください。ただし、大抵の場合はOFFに戻し忘れても自動的にOFFに戻ります。
QuietModeがONになっていると、新規メールなどのエディタ・ウィンドウが、すべてウィンドウ並び順的に、一番奥に出てきます。なので、hidemaruhandle(1)やhidemaruhandle(2)のような、パラメータに1以上を指定するタイプのhidemaruhandle呼び出しは、すべて失敗します。その辺、マクロを作成する上で注意が必要です。
hidemaruhandle(0)は正しい値を返します。また、setactivehidemaruも、ウィンドウハンドルを指定する分には正しく動作しますが、ウィンドウの並び順番号は指定できません。
QuietModeをONにしても、メッセージボックスやダイアログボックスが出る場合は、そのウィンドウはアクティブになって前面に出てくることが多いです。
ReasonMacroStarted関数は、マクロがどのようにして起動されたのかを返します。具体的には、「マクロ・マクロ登録・自動起動」で登録されたマクロが起動されたのか、それとも普通にユーザー様のキーボード/マウス操作で起動されたのかを返します。
マクロが手動実行された場合は0を返します。
マクロが自動実行された場合は、以下の値を返します。
自動起動されたマクロからexecmacro文によって起動されたマクロでも、自動実行の場合の値を返します。
あとで送信なのか今すぐ送信なのかを区別するには、Bypass_GetWindowText関数を使った以下のような処理で判定してください。
SaveConfig関数は、秀丸メールの現在の設定をレジストリに保存します。
この関数は、一般に、内部的な設定値を調べるために使うか、または内部的な設定値の中の一部だけを書き換えたい時に、他の設定値を壊さないようにするために、レジストリを書き換える直前に呼び出して使うことになります。
パラメータ1に数値の0を指定すると、内部的な設定値だけをレジストリに保存します。内部的な設定値とは、例えば「検索して一覧作成」のダイアログボックスを出した時の検索対象フォルダの初期値とか、検索履歴等ってことになります。
パラメータ1に数値の1を指定すると、内部的な設定値も含めてすべての設定をレジストリに出力します。
返り値に意味はありません。
この関数は、特定のDLLが特定の関数をエクスポートしているかどうかを調べます。
DLLのファイル名を指定します。ファイル名は、フルパスで指定してもいいし、ファイル名だけを指定してもいいです。
関数の名前を指定します。
関数が存在する場合は1、そうでない場合は0を返します。
特殊
- 特殊
- ExecAt, ExecAtMain関数(TKInfo.dll)
- EnvChanged関数(TKInfo.dll)
- SetAutoPushTimer, SetAutoPushTimerMilli, SetAutoPushTimerEver, StopAutoPushTimer関数(TKInfo.dll)
- SetAutoPushTimer, SetAutoPushTimerMilli関数
- SetAutoPushTimerEver関数
- StopAutoPushTimer関数
- IsHidemaruMacroExecuting, IsHidemaruMailMacroExecuting関数(TKInfo.dll)
- ReasonMacroStarted関数(TKInfo.dll)
- SaveConfig関数(TKInfo.dll)
- IsFunctionExist関数(TKInfo.dll)
ExecAt, ExecAtMain関数(TKInfo.dll)
ExecAt関数
ExecAt関数は、現在のウィンドウとは別のウィンドウ上でTKInfo.dllの関数呼び出しを実行します。例えば、CurrentAccount関数は、現在のウィンドウでのアカウントを返しますが、例えばエディタが起動している状態で秀丸メール本体側のCurrentAccountの値を取り出したい時に使います。ExecAt関数は、スレッドをまたがってSendMessageすることで実現されているもので、もし、呼び出した先のスレッドが呼び出し元のスレッドに何か要求するような操作をすると、そこでデッドロック状態となり、秀丸メールが固まってしまいます。具体的には、NextUnread/PrevUnreadなど、メールの選択を切り替える関数や、その他、秀丸メールのウィンドウに何らかの変化をもたらせる関数物は一切使えません(スレッド間での排他制御をしようとして固まります)。
もしもデッドロックが発生して固まってしまった場合には、20秒後にエラーメッセージが表示されて復旧するように作ってあります。たたし、その後の秀丸メールの動作は不安定になる可能性が高いです。
ExecAtMain関数
ExecAtMain関数は、エディタウィンドウ上から秀丸メール上でのtkinfo.dll呼び出しを行う専用の関数です。ExecAtMainは、ExecAtと違い、20秒の時間制限が無く、非常に時間のかかる処理でも「デッドロック」のエラーが起きることなく処理できます。ExecAt関数でのパラメータ1(数値型)
実行対象のウィンドウハンドルを指定します。秀丸マクロのhidemaruhandleを使って取得したハンドルを指定するか、またはTKInfo.dllの"MainWnd"関数を使って得た秀丸メール本体ウィンドウのハンドルが指定できます。
ExecAt関数でのパラメータ2(文字列型)、および、ExecAtMain関数でのパラメータ1
実行したい関数名を指定します。
以降のパラメータ(数値型、文字列型不定)
実行したい関数についてのパラメータを追加で指定してください。
返り値
返り値は、関数の返り値そのままです。文字列型か数値型かはこの関数によって決まります。
例
#main = dllfunc("MainWnd"); $account = dllfuncstr("ExecAt", #main, "CurrentAccount"); #n = dllfunc("ExecAtMain", "SetFindPack", "(\"abc\", target=all), inmail=3"); if( dllfunc("ExecAtMain", "FindDownInclude") ) message "ありました"; else message "ありません";
EnvChanged関数(TKInfo.dll)
EnvChanged関数は、秀丸メールの「全般的な設定」について、レジストリに保存された内容を読み込み直し、秀丸メール側に反映します。秀丸マクロのenvchanged文の秀丸メール版です。
全般的な設定は、秀丸マクロのopenreg/writeregstr/writeregnum/closereg文などを使って各自で書き換えてください。具体的にどこをどう書き換えればどこの設定が変わるのかについては、「全般的な設定」を変更してレジストリエディタで調べてください。
パラメータ1(数値型)
パラメータ1には0を指定するか、またはパラメータ1自体を省略してください。
パラメータ1に数値の1を指定すると、EnvChanged関数は、いわゆる「全般的な設定」とは別の、内部的な設定値も含めてレジストリの値をすべて読み込み直しをします。そういう内部的な値を秀丸メールに読み込み直しさせたいような特殊なことをする場合は、1を指定してください。
パラメータ1に数値の1を指定するようなケースでは、レジストリを書き換える前に、SaveConfig関数を呼んでおくことが必要になります。
返り値(数値型)
返り値に意味はありません。
例(2枠区切りと3枠区切りを切り替える例)
loaddll "tkinfo.dll"; openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config"; #pane = getregnum("pane"); if( #pane == 3 ) writeregnum "pane", 2; else writeregnum "pane", 3; closereg; #n = dllfunc("EnvChanged");
補足/注意事項
ウィンドウの座標など、一部の項目についてはレジストリを書き換えても秀丸メール側には反映されません。
レジストリを壊してしまうと秀丸メールの動作がおかしくなることがあるので、壊さないようご注意ください。特に、設定範囲外の値を書き込んだ場合の動作は保証されません。
「秀丸エディタの動作環境」について、読み込み直しを反映する場合は、秀丸マクロのenvchanged文を使用します。
SetAutoPushTimer, SetAutoPushTimerMilli, SetAutoPushTimerEver, StopAutoPushTimer関数(TKInfo.dll)
SetAutoPushTimer, SetAutoPushTimerMilli関数
SetAutoPushTimer, SetAutoPushTimerMilli関数は、メッセージボックスのボタンを一定時間後に押すためのタイマーをセットします。
例えば、「切断しますか?」のメッセージボックスを表示しつつ、ユーザーが何もしなかったら自動的に10秒後に「はい」ボタンを押させたい場合などに使います。
この関数を呼び出した後は、必ずメッセージボックスを表示する必要があります。メッセージボックスを表示しないままマクロを終了してもこのタイマーは生き続けてしまうので、後でメッセージボックス類が誤動作してしまいます。
この関数はダイアログボックスやその他一般のウィンドウについても使えてしまいます。ただし、ダイアログボックスの「OK」ボタンや「キャンセル」ボタンが標準的な「IDOK」や「IDCANCEL」といったIDで定義されていないとうまく動作しません。
パラメータ1(数値型)
何秒後にボタンを押すかの時間を指定します。SetAutoPushTimer関数の場合は秒単位、SetAutoPushTimerMilli関数の場合はミリ秒単位(1/1000秒単位)です。
パラメータ2(文字列型)
押して欲しいボタンを指定します。以下の種類が指定できます。
"" | メッセージボックス中のデフォルトのボタン |
"ok" | 「OK」ボタン |
"cancel" | 「キャンセル」ボタン |
"yes" | 「はい」ボタン |
"no" | 「いいえ」ボタン |
"retry" | 「再試行」ボタン |
"ignore" | 「無視」ボタン |
"abort" | 「中断」ボタン |
返り値(数値型)
返り値に意味はありません。
例
#n = dllfunc("SetAutoPushTimer", 10, "yes"); question( "切断しますか?"); if( result == yes ) #n = dllfunc("Hangup");
SetAutoPushTimerEver関数
SetAutoPushTimerEver関数は、パラメータで指定されたウィンドウ配下に出てくるメッセージボックス/ダイアログボックスについて、すべて自動的にボタンを押してしまう動作をします。メッセージボックス/ダイアログボックス類による問い合わせが連続して出てくるようなケースで、それらをすべて自動処理させたい場合に使います。
パラメータ1(数値型)
自動処理の対象となるウィンドウのハンドルを指定します。普通、hidemaruhandle(0)を指定します。
パラメータ2(文字列型)
押して欲しいボタンを指定します。SetAutoPushTimer関数と同じです。
押して欲しいボタンが存在しなかった場合は、IDOKのボタンを探して、もしそれがあればそれを対象とします。IDOKも無かった場合はIDCANCELが対象となります。
例
#n = dllfunc("SetAutoPushTimerEver", hidemaruhandle(0), "yes"); #n = dllfunc("SendNow"); #n = dllfuc("StopAutoPushTimer");
StopAutoPushTimer関数
StopAutoPushTimer関数は、SetAutoPushTimer系関数でセットしたタイマーを止めます。
SetAutoPushTimer/SetAutoPushTimerMilli関数の場合は別に必要ありませんが、SetAutoPushTimerEver関数を呼び出した場合は、マクロを終了する前に、必ずこの関数を呼び出すようにしてください。でないとマクロを終了した後もタイマーが動作し続けてしまい、余計な警告メッセージ類まで自動的に処理されてしまう恐れがあります。
IsHidemaruMacroExecuting, IsHidemaruMailMacroExecuting関数(TKInfo.dll)
IsHidemaruMacroExecuting関数は、秀丸メール上でのマクロ実行ではなく、別に動作している秀丸エディタ上で現在マクロ実行中かどうかを返します。
IsHidemaruMailMacroExecuting関数は、逆に秀丸メール上で現在マクロ実行中かどうか返します。こちらについては秀丸エディタ側から呼び出されることを想定しています。
秀丸メールと秀丸エディタと連携して何かする場合に、相手側のソフトがマクロ実行中かどうか調べるのに使います。
これらの関数で「0」、すなわち「マクロ実行中でない」と返ったとしても、その後すぐマクロが実行されれば実際に相手側ソフトでのマクロ実行は失敗します。そういう物と理解して使ってください。
注意:この関数は、ソフトウェア名称の変更に伴って関数名が変更されています。ただし、昔の関数(IsTuruKameXXXX関数)もそのまま使えます。
パラメータ
パラメータはありません。
返り値
マクロ実行中の場合は1、そうでない場合(または相手側ソフトが起動してない場合)は0を返します。
備考
秀丸エディタ側からtkinfo.dllの関数を呼び出すには、秀丸メールのレジストリから秀丸メールのインストールされたフォルダを調べる必要があります。具体的にはHKEY_CURRENT_USER\Software\Hidemaruo\TuruKame\ConfigのTuruKameDirキーを参照する必要があります。
例(秀丸メールから秀丸エディタを起動してマクロで何か処理させる例)
loaddll "tkinfo.dll"; while( dllfunc("IsHidemaruMacroExecuting") ) { // 待機 } run hidemarudir + "\\hidemaru.exe /xtest.mac";
SetQuietMode関数(TKInfo.dll)
SetQuietMode関数は、秀丸メールが何らかのウィンドウを表示しても、そのウィンドウをアクティブにしないで静かに動作させる指定をします。例えば定期受信の後に自動起動されるマクロから、NewMail関数を呼ぶなどすると、新規メール用のウィンドウが前面に出てきてしまって都合が悪いです。QuietModeをONにしておくと、生成されたウィンドウが一番裏に出てくる動作となり、パソコンの利用者が何か別の作業をしていてもじゃまにならずに済みます。
パラメータ1(数値型)
1を指定するとQuietModeがONとなり、0を指定すると普通の状態に戻ります。
備考
QuietModeをONにしたら、マクロ終了前にQuietModeをOFFに戻してください。ただし、大抵の場合はOFFに戻し忘れても自動的にOFFに戻ります。
QuietModeがONになっていると、新規メールなどのエディタ・ウィンドウが、すべてウィンドウ並び順的に、一番奥に出てきます。なので、hidemaruhandle(1)やhidemaruhandle(2)のような、パラメータに1以上を指定するタイプのhidemaruhandle呼び出しは、すべて失敗します。その辺、マクロを作成する上で注意が必要です。
hidemaruhandle(0)は正しい値を返します。また、setactivehidemaruも、ウィンドウハンドルを指定する分には正しく動作しますが、ウィンドウの並び順番号は指定できません。
QuietModeをONにしても、メッセージボックスやダイアログボックスが出る場合は、そのウィンドウはアクティブになって前面に出てくることが多いです。
例:
loaddll "tkinfo.dll"; #n = dllfunc("SetQuietMode", 1 ); #n = dllfunc("NewMail"); #n = dllfunc("SetHeader", "To", "test"); #n = dllfunc("SetHeader", "Subject", "test"); #n = dllfunc("SendNow"); #n = dllfunc("SetQuietMode", 0 ); exit;
ReasonMacroStarted関数(TKInfo.dll)
ReasonMacroStarted関数は、マクロがどのようにして起動されたのかを返します。具体的には、「マクロ・マクロ登録・自動起動」で登録されたマクロが起動されたのか、それとも普通にユーザー様のキーボード/マウス操作で起動されたのかを返します。
返り値(数値型)
マクロが手動実行された場合は0を返します。
マクロが自動実行された場合は、以下の値を返します。
秀丸メール起動時の自動実行の場合: | 1 |
秀丸メール終了時の自動実行の場合: | 2 |
受信が一段落した時の自動実行の場合: | 3 |
送信用のエディタ起動時、または、テンプレートでの ExecMacro命令によって起動された場合: | 4 |
あとで送信/今すぐ送信の自動実行の場合: | 5 |
送受信の開始直前の場合: | 6 |
備考
自動起動されたマクロからexecmacro文によって起動されたマクロでも、自動実行の場合の値を返します。
あとで送信なのか今すぐ送信なのかを区別するには、Bypass_GetWindowText関数を使った以下のような処理で判定してください。
$s = dllfuncstr("Bypass_GetWindowText", hidemaruhandle(0) ); if( leftstr( $s, 6 ) == "今すぐ" ) { message "今すぐ送信"; } else { message "あとで送信"; }
例
loaddll "tkinfo.dll"; if( dllfunc("ReasonMacroStarted") != 0 ) { message "自動実行されました。"; } else { message "手動実行されました。"; }
SaveConfig関数(TKInfo.dll)
SaveConfig関数は、秀丸メールの現在の設定をレジストリに保存します。
この関数は、一般に、内部的な設定値を調べるために使うか、または内部的な設定値の中の一部だけを書き換えたい時に、他の設定値を壊さないようにするために、レジストリを書き換える直前に呼び出して使うことになります。
パラメータ1(数値型)
パラメータ1に数値の0を指定すると、内部的な設定値だけをレジストリに保存します。内部的な設定値とは、例えば「検索して一覧作成」のダイアログボックスを出した時の検索対象フォルダの初期値とか、検索履歴等ってことになります。
パラメータ1に数値の1を指定すると、内部的な設定値も含めてすべての設定をレジストリに出力します。
返り値(数値型)
返り値に意味はありません。
例
loaddll "tkinfo.dll"; #n = dllfunc("SaveConfig", 0); openreg "CURRENTUSER", "Software\\Hidemaruo\\TuruKame\\Config"; writeregnum "FindPersonSel", 0; // 検索対象フォルダを「すべてのアカウント」にする closereg; #n = dllfunc("EnvChanged", 1);
IsFunctionExist関数(TKInfo.dll)
この関数は、特定のDLLが特定の関数をエクスポートしているかどうかを調べます。
パラメータ1(文字列型)
DLLのファイル名を指定します。ファイル名は、フルパスで指定してもいいし、ファイル名だけを指定してもいいです。
パラメータ2(文字列型)
関数の名前を指定します。
返り値(数値型)
関数が存在する場合は1、そうでない場合は0を返します。
例:
if( ! dllfunc("IsFunctionExist", "tkinfo.dll", "GetSpamFilterTitle") ) { message "秀丸メールのバージョンが古いです。"; }
2006年05月22日(月) 14:47:48 Modified by aqualung