タブー編 ~C#側から秀丸のアクティブウィンドウ切り替えはダメ~

概要

COMでは難しく、秀丸マクロでは簡単な分野がある。

COMなら簡単だが、秀丸マクロでは難しいこと。

秀丸マクロは「時間を跨いだ継続処理」は苦手とします。
例えば、「10分間継続して実行されつづける秀丸マクロ」、などというのは現実的ではありません
その間、秀丸を操作出来なくなってしまうからです。

一方、hm.NETは「時間を跨いだ処理の継続」を得意とします。
秀丸を実行している間、ずっと実行されているようなプログラムを制作したとしても
全く問題はありません。

秀丸マクロなら比較的簡単だが、dllではこのましくないこと

COMを利用したcreateobjectや、loaddllを利用したdll利用でも同じですが、
例えば、以下のようにC#側から別秀丸プロセスを生み出したり、
アクティブウィンドウを切り替えたりする、といのはこのましい行為ではありません。

C#側から別秀丸へのアクティブウィンドウ切り替えをするマクロを発行するのは、このましくないといえます。

  • C#側のソース

    MyTestForm.cs
    using System;
    using System.Runtime.InteropServices;
    using HmNetCOM;
    
    namespace NET4COMServer
    {
        [ComVisible(true)]
        [Guid("BD55F2A6-9ED0-4F4F-9D37-E6B84BE63272")]
        public class NET4COMServer 
        {
            public int TestMethod()
            {
                try
                {
                    var ret = Hm.Macro.Eval(@"openfile ""abc"";");
                    System.Diagnostics.Trace.WriteLine(ret.Message);
                    System.Diagnostics.Trace.WriteLine(ret.Result);
                    System.Diagnostics.Trace.WriteLine(ret.Error);
    
                }
                catch (Exception e)
                {
                    System.Diagnostics.Trace.WriteLine(e);
                }
    
                return 1;
            }
        }
    }
    
  • 秀丸マクロ側のソース

    test01.macなどと適当に名前を付ける
    #obj = createobject( currentmacrodirectory + @"\NET4COMServer.dll", "NET4COMServer.NET4COMServer");
    keepobject #obj, 1;
    #add = member(#obj, "TestMethod");
    
    message("マクロは終了しました");