おいしいマクロの作り方 (4)

前回までの流れ

 第1回 第2回 第3回

  • 「指定した時間経ったらマナーモードを解除する」マクロを作る
  • マクロには以下の機能が必要
    • 起動するとマナーモードになる
    • タイマーで指定した時間が経つとマナーモードを解除する
    • マナーモードを解除した際にタイマーが残らないようにする
  • 具体的な実現方法は以下のとおり
    • A.CondExecのタイムアウト処理を使う
      • A1.CondExecの監視対象のアプリを起動してCondExecを終了する
      • A2.別のCondExecを終了オプションで起動し、CondExecを終了させる
    • B.一定時間で自動終了するDoNothingを別に起動し、その終了をCondExecで監視する
  • BよりAのほうがスマートなのでこちらを採用する、A1・A2は保留

仕様を詳しく決める

まだ決めることの出来ない部分があるので、さらに具体的な仕様を決めます。

タイマー時間をリスト表示し、そこから選んでマナーモードにする
  • 時間を1分単位で指定できれば理想なんですが、やり方を思いつかなかったんでリスト表示から選択することにします
  • リスト表示型のランチャーということで、今回はSimpleMenuを使います
マナーモード中に再度実行すると、マナーモードを解除する
  • トグル式に処理を切り替えます
  • このように状況によって処理を切り替える場合、CondExecかExecIfを利用します

仕様を元に設計する

A.CondExecのタイムアウト処理を使う
  • 処理開始(CondExecかExecIf)
    • タイマー起動中ならマナーモード終了処理
      • タイマー起動中=CondExec(Timer_XXmin)起動中
    • タイマー未起動ならリスト表示(SimpleMenu)
  • リスト表示(SimpleMenu)
    • 30分(ExecMulti MannerTimer_30)
      • マナーモード有効化(SetManner)
      • CondExec(MannerTimer_30=30分後にタイムアウト)起動
    • 60分(ExecMulti MannerTimer_60)
    • 120分(ExecMulti MannerTimer_120)

タイマーとして起動するCondExecは、タイムアウト時間をそれぞれ指定する必要があるため、時間に応じた別々のタイトルを持つことになります(MannerTimer_30、MannerTimer_60...) そのため、チェック対象のタイトルを1つしか指定できないCondExecは使えません。全てのCondExecのタイトルをExecIfでチェックします。
結果、ExecIf、ExecMulti、CondExecのそれぞれでタイムアウト時間ごとの設定を行う必要があるわけです。これだとどうも美しくありません。そこで前回没にしたB案を再度見直してみます。

B.一定時間で自動終了するDoNothingを別に起動し、その終了をCondExecで監視する
  • 処理開始(CondExecかExecIf)
    • タイマー起動中ならマナーモード終了処理
      • タイマー起動中=DoNothing起動中
    • タイマー未起動ならリスト表示(SimpleMenu)
  • リスト表示(SimpleMenu)
    • 30分(ExecMulti MannerTimer_30)
      • DoNothing 30分後に終了するよう起動
      • マナーモード有効化(SetManner)
      • CondExec(DoNothing監視)起動
    • 60分(ExecMulti MannerTimer_60)
    • 120分(ExecMulti MannerTimer_120)

DoNothingは起動時にパラメータで起動時間を与えられるため、別々の起動時間に同じタイトルを与えられます。A案で問題だった設定が面倒な点が解消されているわけです。

  • A案:設定は複雑だが常駐アプリが1つだけ
  • B案:設定が簡単だが常駐アプリが2つ

前回の決定を覆すようでアレですが、運用が簡単なB案でいくことにします。
作ってる最中に方針が変わることなんて、マクロ作りではよくある話なわけですよ(待て