不记得哪里找来的了,可用。
下面以一个接收到字符“1”就关闭程序为例
发送消息端实现:
#region /******进程间通信********/ public struct CopyDataStruct { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } public const int WM_COPYDATA = 0x004A; //当一个应用程序传递数据给另一个应用程序时发送此消息指令 //通过窗口的标题来查找窗口的句柄 [DllImport("User32.dll", EntryPoint = "FindWindow")] private static extern int FindWindow(string lpClassName, string lpWindowName); //在DLL库中的发送消息函数 [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage ( int hWnd, // 目标窗口的句柄 int Msg, // 在这里是WM_COPYDATA int wParam, // 第一个消息参数 ref CopyDataStruct lParam // 第二个消息参数 ); /******进程间通信********/ #endregion
发送消息端调用:
#region try { string text = "1"; CopyDataStruct cds; cds.dwData = (IntPtr)1; //这里可以传入一些自定义的数据,但只能是4字节整数 cds.lpData = text; //消息字符串 cds.cbData = System.Text.Encoding.Default.GetBytes(text).Length + 1; //注意,这里的长度是按字节来算的 SendMessage(FindWindow(null, "System"), WM_COPYDATA, 0, ref cds); // 这里要修改成接收窗口的标题“System” } catch { } #endregion
接收端处理:
#region //WM_COPYDATA消息所要求的数据结构 public struct CopyDataStruct { public IntPtr dwData; public int cbData; [MarshalAs(UnmanagedType.LPStr)] public string lpData; } private const int WM_COPYDATA = 0x004A; //接收消息方法 protected override void WndProc(ref System.Windows.Forms.Message e) { if (e.Msg == WM_COPYDATA) { CopyDataStruct cds = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct)); if(cds.lpData.ToString() == "1") Application.Exit(); //如果消息字符串是1,就结束自己 } base.WndProc(ref e); } #endregion
接收端下面这句就是本次需求主要的业务代码了:
if(cds.lpData.ToString() == "1") Application.Exit();