C# 进程之间的通讯
生活随笔
收集整理的這篇文章主要介紹了
C# 进程之间的通讯
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
該方法針對同一臺服務器上的2個進程之間的通訊,進程A是一個實時采集程序,可能由于某個異常或運行時間過長導致程序卡死,現需要啟動另外一個進程B來對
進程A進行定時監控,如果發現A卡死或無故退出,則自動啟動進程A。
進程A的代碼如下:
public struct COPYDATASTRUCT{public IntPtr dwData;public int cbData;[MarshalAs(UnmanagedType.LPStr)]public string lpData;}[DllImport("User32.dll", EntryPoint = "FindWindow")]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport("user32", EntryPoint = "GetWindowThreadProcessId")]public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int pid);[DllImport("User32.dll", EntryPoint = "SendMessage")]//用SendMessage發送消息必須是針對有窗體顯示的進程才可以發送成功private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);//用 PostThreadMessage 可以給無窗體的主線程發送消息[return: MarshalAs(UnmanagedType.Bool)][DllImport("user32.dll", SetLastError = true)]public static extern bool PostThreadMessage(int threadId, uint msg, IntPtr wParam, IntPtr lParam);const int WM_COPYDATA = 0x004A; /// <summary>/// 給進程 DCZKStart.exe 發送消息/// </summary>/// <param name="iflag">消息標記,可以是任意整數值,這個固定0 </param>/// <param name="msg">消息內容</param>private void SendMsgToProcess(int iflag,string msg="") { //利用發送消息方式,給進程 DCZKStart.exe 發送心跳 try{int ihwd = GetDCZKStartProcessHandle();byte[] sarr = System.Text.Encoding.Default.GetBytes(msg);int len = sarr.Length;COPYDATASTRUCT cds;cds.dwData = (IntPtr)Convert.ToInt16(iflag.ToString());//可以是任意值 cds.cbData = len + 1;//指定lpData內存區域的字節數 cds.lpData = msg;//發送給目標窗口所在進程的數據 SendMessage(ihwd, WM_COPYDATA, 0, ref cds);}catch(Exception ex){ShowLogInfo(ex.Message, true);} } private int GetDCZKStartProcessHandle() //獲取進程 DCZKStart.exe 的進程句柄 {int ihWnd = -1;try{Process p = Process.GetProcessesByName("DCZKStart")[0];if (p!=null){ IntPtr hwnd = p.MainWindowHandle; //如果窗體最小化,這根據窗體名稱來查找if (hwnd==IntPtr.Zero){hwnd = FindWindow(null, "DCZKStart_V3");if (hwnd!=IntPtr.Zero){ihWnd = (int)hwnd; }}else{ihWnd = (int)hwnd; }}}catch (Exception ex){ShowLogInfo(ex.Message, true);}return ihWnd;}其中函數 ?SendMsgToProcess ?就是用來給進程B發送通知消息的,這個消息定時30秒發送一次,以此來告訴進程B它還活著。
這里有一點要注意:就是想要利用SendMessage來發送消息,接收方必須要有窗體,如果窗體隱藏了,則需要通過 FindWindow 來獲取窗體句柄。
?
?
進程B的代碼:
/// <summary>/// 消息接受處理函數/// </summary>/// <param name="m"></param>protected override void DefWndProc(ref Message m){try{//以下方法針對有窗體顯示的進程才有效 switch (m.Msg){case WM_COPYDATA:COPYDATASTRUCT cds = new COPYDATASTRUCT();Type t = cds.GetType();cds = (COPYDATASTRUCT)m.GetLParam(t);string strResult = cds.dwData.ToString() + ":" + cds.lpData;//根據 strResult 的內容來做出相應的動作//doSomethings
break;default:base.DefWndProc(ref m);break;}}catch(Exception ex){ShowLogInfo(ex.Message);}}
?
轉載于:https://www.cnblogs.com/lpq21314/p/9512730.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C# 进程之间的通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux如何实现远程登录
- 下一篇: 配置IP和网络故障排查