最終更新日 2022-03-24

更新や具体的操作があるかのチェック~ (秀丸エディタ 9.12以降)

概要

監視・常駐型のプログラムを作る際に、「秀丸上で何も更新や具体的な操作がないならば、何もする必要がない」といった
プログラムを作ることは十分ありえるシチュエーションです。

このような目的のため、Hm.Edit.UpdateCount が利用できます。
これは秀丸マクロ変数の「updatecount」相当のものとなります。

更新や具体的操作があるかの判断材料となる updatecount 相当の値を取得する

マクロ中でもマクロ中以外でも、常時取得することが出来ます。

int Hm.Edit.getUpdateCount()

返り値は常に0以上の値となります。
秀丸のバージョンが不足していて、該当のメソッドが機能しない時や、何らかの内部エラーの場合は、-1が返ってきます。

  • C++側のソース

    dllmain.cpp
    #include "HmCppInvoke.h"
    #include <thread>
    
    using namespace Hidemaru;
    using namespace std;
    
    
    
    
    bool bThreadCenceller = false;
    const int sleepInterval = 1000;
    HANDLE hThread = NULL;
    
    DWORD WINAPI ThreadFunc(LPVOID pParam)
    {
    
        while (true) {
            Sleep(sleepInterval);
    
            int updatecount = Hm.Edit.getUpdateCount();
            if (updatecount >= 0) {
                auto str_count = to_wstring(updatecount);
                Hm.OutputPane.output(str_count + L"\r\n");
            }
    
            if (bThreadCenceller) {
                break;
            }
    
        }
    
        Hm.OutputPane.output(L"スレッドが終了");
        return 0;
        // スレッド終了
    }
    
    extern "C" __declspec(dllexport) THmNumber DllDetachFunc_After_Hm866(THmNumber n) {
    
        Hm.funcDllExport();
    
        // スレッドを必ず終了させてから、dllが解放されるようにしておかないと飛んでしまう。
        bThreadCenceller = true;
        WaitForSingleObject(hThread, sleepInterval * 2);
    
        return 0;
    }
    
    extern "C" __declspec(dllexport) THmNumber test() {
    
        Hm.funcDllExport();
    
        bThreadCenceller = false;
    
        hThread = CreateThread(
            NULL,
            0,
            ThreadFunc,
            NULL,
            0,
            NULL
        );
    
        Hm.OutputPane.output(L"test関数の終了直前\r\n");
    
        return 1;
    }
    
  • 秀丸マクロ側のソース

    test.mac
    #dll = loaddll(currentmacrodirectory + @"\dll1.dll");
    #r = dllfuncw(#dll, "test");
    

    テキストを編集してみたり、メニュー上の操作をしてみたり、
    操作をやめてマウスだけ動かしてみたりして、
    updatecount がどのように更新されていくのか確認してみてください。