|
もうひとつのパターンがファイル名でマクロを実行するパターンです。
下記では、「b.mac」というファイルを改めて用意し、
b.macからも同じWpfApp2.exeを呼び出しています。
「同じプロセス内」の「同じアセンブリ」であれば、値が継続しているという特性を
利用したものとなります。
・メリット:C#コードで管理出来る
・デメリット:別途マクロが必要となっています。
又、アセンブリの読み込まれ具合などがかなりスパゲッティとなる。
//-------------------------------------------------------
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using Hidemaru;
namespace HmWPFTest
{
public class HmWPFTestClass : System.Windows.Window
{
public HmWPFTestClass()
{
SetForm();
SetButton();
}
Canvas c;
void SetForm()
{
this.Title = "秀丸マクロ hmPyによるWPFに組み込むWPF";
this.FontSize = 22;
this.Width = 1000;
this.Height = 500;
c = new Canvas();
this.Content = c;
}
Button btn;
void SetButton()
{
var ef = new System.Windows.Media.Effects.DropShadowEffect
{
BlurRadius = 5,
ShadowDepth = 1
};
btn = new Button()
{
Content = "秀丸",
Padding = new System.Windows.Thickness(2),
Effect = ef,
Foreground = Brushes.White,
Background = Brushes.Black
};
btn.Click += Btn_Click;
c.Children.Add(btn);
Canvas.SetLeft(btn, 30);
Canvas.SetTop(btn, 100);
}
// ボタンが押されたら、文字列をpublicから見えるクラスに伝達して、
// b.macを実行する。
private void Btn_Click(object sender, RoutedEventArgs e)
{
// マクロが実行されていないなれば…
if (!Hm.Macro.IsExecuting) {
MyQueue.SetStrTrans("テスト♬\n\tテスト\n");
var thisfullpath = System.Reflection.Assembly.GetExecutingAs
sembly().Location;
var dir = System.IO.Path.GetDirectoryName(thisfullpath);
try
{
var ret = Hm.Macro.Exec.File(dir + "/b.mac");
// マクロファイルの最後のendmacroの後に続く文字が返って
くればマクロが達成されたこととなる。
if (ret.Message == "MACROCOMPLETE")
{
System.Diagnostics.Trace.WriteLine("OK");
}
else
{
System.Diagnostics.Trace.WriteLine(ret.Error);
System.Diagnostics.Trace.WriteLine("NO");
}
}
catch (Exception err)
{
System.Diagnostics.Trace.WriteLine(err);
}
}
}
}
// b.macからみのクラス
public class MyQueue
{
private static string strTrans;
public static void SetStrTrans(string message) { strTrans = message; }
public static String TotalTextReplace() {
if (strTrans != null) {
Hm.Edit.TotalText = strTrans;
return strTrans;
}
return "";
}
}
public class MyEntry
{
public static System.Windows.Window form;
public static IntPtr CreateForm()
{
if (form != null)
{
form.Close();
form = null;
}
form = new HmWPFTestClass();
form.Show();
return (IntPtr)1;
}
public static IntPtr OnDetathMethod()
{
if (form != null)
{
form.Close();
form = null;
}
return (IntPtr)1;
}
}
}
//------------------------- aaa.mac ---------------------------
debuginfo 1;
debuginfo "MacroStart\n";
#HMNET = loaddll( hidemarudir + @"\hm.NET.dll" );
#r = dllfuncw( #HMNET, "SetDetachMethod", currentmacrodirectory + @"\WpfApp2.
exe", "HmWPFTest.MyEntry", "OnDetathMethod" );
#r = dllfuncw( #HMNET, "CallMethod", currentmacrodirectory + @"\WpfApp2.exe",
"HmWPFTest.MyEntry", "CreateForm" );
debuginfo "MacroEnd\n";
//-------------------------- b.mac ---------------------------
#HMNET = loaddll( hidemarudir + @"\hm.NET.dll" );
$r = dllfuncstrw( #HMNET, "CallMethod", currentmacrodirectory + @"\WpfApp2.e
xe", "HmWPFTest.MyQueue", "TotalTextReplace" );
endmacro "MACROCOMPLETE";
|
|