using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
//compile with /unsafe
namespace CopyDataInterop
{
public partial class Form1 : Form
{
public const int WM_COPYDATA = 0x004a;
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
[MarshalAs(UnmanagedType.I4)]
public int dwData;
[MarshalAs(UnmanagedType.I4)]
public int cbData;
[MarshalAs(UnmanagedType.SysInt)]
public IntPtr lpData;
}
public Form1()
{
InitializeComponent();
this.Text = "HWND " + this.Handle.ToString();
}
unsafe protected override void WndProc(ref Message message)
{
if (message.Msg == WM_COPYDATA)
{
COPYDATASTRUCT data = (COPYDATASTRUCT)
message.GetLParam(typeof(COPYDATASTRUCT));
string str = new string((char*)(data.lpData),
0, data.cbData/2);
MessageBox.Show(str, "Data received",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
base.WndProc(ref message);
}
unsafe private void SendString()
{
string s = this.textBox2.Text;
IntPtr lpData = Marshal.StringToHGlobalUni(s);
COPYDATASTRUCT data = new COPYDATASTRUCT();
data.dwData = 0;
data.cbData = s.Length * 2;
data.lpData = lpData;
IntPtr lpStruct = Marshal.AllocHGlobal(
Marshal.SizeOf(data));
Marshal.StructureToPtr(data, lpStruct, false);
int hTarget = Convert.ToInt32(textBox1.Text);
SendMessage(hTarget, WM_COPYDATA,
this.Handle, lpStruct);
}
private void button1_Click(object sender, EventArgs e)
{
SendString();
}
[DllImport("User32.dll")]
private static extern bool SendMessage(int hWnd,
int wMsg, IntPtr wParam, IntPtr lParam);
}
}
|