//SendMessageで送る構造体(Unicode文字列送信に最適化したパターン)
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct COPYDATASTRUCT
{
	public IntPtr dwData;
	public int cbData;
	[MarshalAs(UnmanagedType.LPWStr)]
	public string lpData;
}

//送信側のフォームクラス
class FmSend : Form
{
	void SampleStart()
	{
		IntPtr hWnd = 相手先のウィンドウハンドル;
		string myMes = "相手に届けたい文字列";
		SendString(hWnd, myMes);
	}
	
	//SendMessageを使ってプロセス間通信で文字列を渡す
	void SendString(IntPtr targetWindowHandle, string str)
	{
		COPYDATASTRUCT cds = new COPYDATASTRUCT();
		cds.dwData = IntPtr.Zero;
		cds.lpData = str;
		cds.cbData = str.Length * sizeof(char);
		//受信側ではlpDataの文字列を(cbData/2)の長さでstring.Substring()する

		IntPtr myWindowHandle = Process.GetCurrentProcess().MainWindowHandle;
		SendMessage(targetWindowHandle, WM_COPYDATA, myWindowHandle, ref cds);
	}

	//SendMessage(データ転送)
	[DllImport("user32.dll", CharSet = CharSet.Auto)]
	public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
	public const int WM_COPYDATA = 0x004A;
}

//受信側のフォームクラス
class FmReceive : Form
{
	//メッセージ処理
	protected override void WndProc(ref Message m)
	{
		if (m.Msg == WM_COPYDATA)
		{
			string sParam = ReceiveString(m);
			FuncNaniNani(sParam);
		}
		
		base.WndProc(ref m);
	}
	
	//SendString()で送信された文字列を取り出す
	string ReceiveString(Message m)
	{
		string str = null;
		try
		{
			COPYDATASTRUCT cds = (COPYDATASTRUCT)m.GetLParam(typeof(COPYDATASTRUCT));
			str = cds.lpData;
			str = str.Substring(0, cds.cbData / 2);
		}
		catch { str = null; }
		return str;
	}
}