秀丸マクロ.net

マクロの開始・終了と、プログラムの常駐

  • 概要

    hm.NETの特徴は

    マクロ自体の実行は一瞬で終了し、マクロが終了した後もプログラムが常駐する

    というタイプのモジュール作成に向いているということです。 このことを確認してみましょう。

  • マクロの開始・終了と、プログラムの常駐(前章と全く同じC#プログラムです)

    • C#側のソース

      HmTestClass06.dllとしてコンパイルのこと
      using System;
      using System.Windows.Forms;
      
      namespace HmTestClass06
      {
          class MonitorForm : Form
          {
              Timer timer;
      
              public MonitorForm()
              {
                  this.FormClosing += form_FormClosing;
                  CreateTimer();
              }
      
              private void CreateTimer()
              {
                  timer = new Timer()
                  {
                      Interval = 1000
                  };
      
                  timer.Tick += timer_Tick;
                  timer.Enabled = true;
                  timer.Start();
              }
      
              private void DeleteTimer()
              {
                  if (timer != null)
                  {
                      timer.Stop();
                      timer = null;
                  }
              }
      
              private void timer_Tick(object sender, EventArgs e)
              {
                  System.Diagnostics.Trace.WriteLine("定期実行");
              }
      
              private void form_FormClosing(object sender, FormClosingEventArgs e)
              {
                  StopMonitor();
              }
      
              private void StopMonitor()
              {
                  try
                  {
                      DeleteTimer();
                  }
                  catch (Exception e)
                  {
                      System.Diagnostics.Trace.WriteLine(e.Message);
                  }
              }
      
          }
      
          public class Class6
          {
              private static Form form;
      
              public static IntPtr CreateForm()
              {
                  if (form == null || !form.Visible)
                  {
                      form = new MonitorForm();
                  }
      
                  form.Show();
                  return (IntPtr)1;
              }
      
              private static void DestroyForm()
              {
                  if (form != null)
                  {
                      form.Close();
                      form = null;
                  }
              }
      
              public static IntPtr OnDetathMethod()
              {
                  DestroyForm();
      
                  return (IntPtr)0;
              }
      
          }
      }
      
      
    • 秀丸マクロ側のソース

      test01.macなどと適当に名前を付ける
      debuginfo 1;
      debuginfo "macro start\n";
      #HMNET = loaddll( hidemarudir + @"\hm.NET.dll" );
       
      #r = dllfuncw( #HMNET, "SetDetachMethod", currentmacrodirectory + @"\HmTestClass06.dll", "HmTestClass06.Class6", "OnDetathMethod" );
      #r = dllfuncw( #HMNET, "CallMethod", currentmacrodirectory + @"\HmTestClass06.dll", "HmTestClass06.Class6", "CreateForm" );
      debuginfo "macro end\n";
      

      マクロ自体は一瞬で実行を終了した後
      定期的にデバッグメッセージが出力されることがわかります。

      この、

      • マクロは一瞬で終わる

        C#のstatic関数を実行するだけ

      • dllは処理を継続させても良い

        秀丸マクロの実行自体は終わっても、C#のdllの処理は続いている

      というhm.NETとC#の組み合わせの特徴は、複雑なモジュールを作成する上では必須のパターンとなります。