看到论坛上一个问题:程序已经在运行,再次运行时,要向前一个实例发送一些消息。
简单的写了一些,直接贴代码!
1、封装了一个类,用于发送信息
class Note
{
[DllImport("User32.dll", EntryPoint = "SendMessage")]
private static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref CopyData lParam);
[DllImport("User32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
//定义消息常数
public const int WM_COPYDATA = 0x004A;
public struct CopyData
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
public static bool SendMsg(string MSG)
{
var hwnd = FindWindow(null, "MainForm");
if (hwnd == IntPtr.Zero)
{
return false;
}
CopyData data;
data.dwData = IntPtr.Zero;
data.lpData = MSG;
data.cbData = Encoding.Default.GetBytes(data.lpData).Length + 1;
SendMessage(hwnd, WM_COPYDATA, 0, ref data);
return true;
}
}
2、在MainForm里override了WndProc,用于接收消息
protected override void WndProc(ref Message m)
{
if (m.Msg == Note.WM_COPYDATA)
{
string s = ((Note.CopyData)Marshal.PtrToStructure(m.LParam, typeof(Note.CopyData))).lpData;
MessageBox.Show(s);
}
else
base.WndProc(ref m);
}