C# 进程之间的通讯
生活随笔
收集整理的這篇文章主要介紹了
C# 进程之间的通讯
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
該方法針對(duì)同一臺(tái)服務(wù)器上的2個(gè)進(jìn)程之間的通訊,進(jìn)程A是一個(gè)實(shí)時(shí)采集程序,可能由于某個(gè)異常或運(yùn)行時(shí)間過長(zhǎng)導(dǎo)致程序卡死,現(xiàn)需要啟動(dòng)另外一個(gè)進(jìn)程B來對(duì)
進(jìn)程A進(jìn)行定時(shí)監(jiān)控,如果發(fā)現(xiàn)A卡死或無故退出,則自動(dòng)啟動(dòng)進(jìn)程A。
進(jìn)程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發(fā)送消息必須是針對(duì)有窗體顯示的進(jìn)程才可以發(fā)送成功private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);//用 PostThreadMessage 可以給無窗體的主線程發(fā)送消息[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>/// 給進(jìn)程 DCZKStart.exe 發(fā)送消息/// </summary>/// <param name="iflag">消息標(biāo)記,可以是任意整數(shù)值,這個(gè)固定0 </param>/// <param name="msg">消息內(nèi)容</param>private void SendMsgToProcess(int iflag,string msg="") { //利用發(fā)送消息方式,給進(jìn)程 DCZKStart.exe 發(fā)送心跳 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內(nèi)存區(qū)域的字節(jié)數(shù) cds.lpData = msg;//發(fā)送給目標(biāo)窗口所在進(jìn)程的數(shù)據(jù) SendMessage(ihwd, WM_COPYDATA, 0, ref cds);}catch(Exception ex){ShowLogInfo(ex.Message, true);} } private int GetDCZKStartProcessHandle() //獲取進(jìn)程 DCZKStart.exe 的進(jìn)程句柄 {int ihWnd = -1;try{Process p = Process.GetProcessesByName("DCZKStart")[0];if (p!=null){ IntPtr hwnd = p.MainWindowHandle; //如果窗體最小化,這根據(jù)窗體名稱來查找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;}其中函數(shù) ?SendMsgToProcess ?就是用來給進(jìn)程B發(fā)送通知消息的,這個(gè)消息定時(shí)30秒發(fā)送一次,以此來告訴進(jìn)程B它還活著。
這里有一點(diǎn)要注意:就是想要利用SendMessage來發(fā)送消息,接收方必須要有窗體,如果窗體隱藏了,則需要通過 FindWindow 來獲取窗體句柄。
?
?
進(jìn)程B的代碼:
/// <summary>/// 消息接受處理函數(shù)/// </summary>/// <param name="m"></param>protected override void DefWndProc(ref Message m){try{//以下方法針對(duì)有窗體顯示的進(jìn)程才有效 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;//根據(jù) strResult 的內(nèi)容來做出相應(yīng)的動(dòng)作//doSomethings
break;default:base.DefWndProc(ref m);break;}}catch(Exception ex){ShowLogInfo(ex.Message);}}
?
轉(zhuǎn)載于:https://www.cnblogs.com/lpq21314/p/9512730.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的C# 进程之间的通讯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux如何实现远程登录
- 下一篇: C# webservice服务跟踪调试方