using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Text;
using System.Threading;
namespace DTX2WAV
{
public static class CSendMessage
{
#region #28821 2014.1.23 yyagi add: 外部からの文字列メッセージ送受信 定数定義
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
public IntPtr dwData;
public UInt32 cbData;
public IntPtr lpData;
}
#endregion
public const int WM_COPYDATA = 0x004A;
[DllImport("USER32.dll")]
static extern uint SendMessage(IntPtr window, int msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
///
/// 別のウインドウにメッセージを送信する
/// DTXCreatorで使っているコードをほぼそのまま流用(FDK依存をなくしただけ)
///
///
///
///
///
public static uint sendmessage(IntPtr MainWindowHandle, IntPtr FromWindowHandle, string arg)
{
uint len = (uint)arg.Length;
COPYDATASTRUCT cds;
cds.dwData = IntPtr.Zero; // 使用しない
cds.lpData = Marshal.StringToHGlobalUni(arg); // テキストのポインターをセット
cds.cbData = (len + 1) * 2; // 長さをセット
//文字列を送る
uint result = SendMessage(MainWindowHandle, WM_COPYDATA, FromWindowHandle, ref cds);
Marshal.FreeHGlobal(cds.lpData);
return result;
}
}
///
/// 起動中のDTXMania本体にメッセージを送信する
/// DTXManiaのProgram.cs内のロジックを一部修正して流用
///
public static class CSendMessageToDTXMania
{
public static void SendMessage(string strSend)
{
for (int i = 0; i < 5; i++) // 検索結果のハンドルがZeroになることがあるので、200ms間隔で5回リトライする
{
#region [ 既に起動中のDTXManiaプロセスを検索する。]
Process current = Process.GetCurrentProcess();
Process target = null;
Process[] running = Process.GetProcesses();
foreach (Process p in running)
{
if (p.MainWindowHandle != IntPtr.Zero && p.MainWindowTitle.Contains("DTX2WAV ("))
{
target = p;
break;
}
}
#endregion
#region [ 起動中のDTXManiaがいれば、そのプロセスにコマンドラインを投げる ]
if (target != null && strSend != null)
{
CSendMessage.sendmessage(target.MainWindowHandle, current.MainWindowHandle, strSend);
}
#endregion
else
{
Trace.TraceInformation("メッセージ送信先のプロセスが見つからず。5回リトライします。");
Thread.Sleep(200);
}
}
}
}
}