最終更新日 2024-09-25

WPFのアプリの形態をそのまま利用する方法

概要

秀丸のCOMの利用は、インプロセス用呼び出しに過ぎませんから、
インプロセスでロード(該当秀丸プロセスと同じプロセスへとロード)されるのであれば、
.dll 形式である必要もなく、.exeでも.dll同様に扱うことが出来ます。

WPFのアプリケーションを「.NET Framework」で作成

プロジェクトに対して 「アセンブリを.COM参照可能とする」を付与することを忘れずに。

MainWindows.xaml を編集して、my_textbox と my_button を作りましょう。

my_button の Click のイベントハンドラからメソッドを自動生成して...

自動生成しなくとも、ご自分で MainWindow.xaml.cs を直接編集する形でももちろんOKです。

イベントハンドラ実装

ここではあくまでも秀丸マクロのCOMからインプロセスでWPFのウィンドウを利用する方法ですので、
ボタンを押した再の処理は何もしていません

using System;
using System.Windows;



namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void On_Click(object sender, RoutedEventArgs e)
        {
            String text = this.my_textbox.Text;
            
        }
    }
}

秀丸マクロから直接呼び出されるメソッドを定義

定義場所に迷うところですがが、 App.xaml.cs が空っぽですので、ここが良いでしょう。

using System;
using System.Windows;
using System.Runtime.InteropServices;



namespace WpfApp1
{
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    [Guid("452F8C3D-A209-4DC3-ADFF-5BCABF8E4949")]
    public partial class AppHmInterface
    {
        public static Window wpfWindow;

        public long CreateFrom()
        {
            if (wpfWindow != null)
            {
                wpfWindow.Close();
                wpfWindow = null;
            }
            wpfWindow = new MainWindow();
            wpfWindow.Show();
            return 1;
        }

        // 秀丸のバージョンで引数が渡ってくるものと渡ってこないものがあるので、
        // 両対応にするためデフォルト引数の0が必要。
        public void OnReleaseObject(int reason = 0)
        {
            // 秀丸エディタが閉じられる前に実行されるコード
            // このWPFアプリケーションを終了します。
            if (wpfWindow != null)
            {
                wpfWindow.Close();
                wpfWindow = null;

                // このメソッドが通過したことをわかりやすくするため、終了理由の番号をダイアログボックスで表示
                MessageBox.Show("あいうえお");
            }
        }

        // Hm.IComSupportX64 の実装
        public bool X64MACRO()
        {
            return true;
        }
    }
}

秀丸マクロ側のソース

呼び出し側のマクロを用意しましょう。
マクロが終わっても、WpfApp1のオブジェクトが解放されたりしないよう、keepobjectしています。
また、秀丸が終了した際に、実行してほしいメソッドとして、C#内の OnDetachMethod を指定しています。

WpfTest.mac
#obj = createobject( currentmacrodirectory + @"\WpfApp1.exe", "WpfApp1.AppHmInterface");
setcomdetachmethod #obj, "OnReleaseObject";
keepobject #obj, 1; // マクロが終了しても#objを自動でreleaseしない。

#r = member(#obj, "CreateFrom");

WpfApp1.exeと、このWpfWpfTest.mac の2つのファイルを同一のディレクトリに配置して、マクロを実行してみましょう。