该方法针对同一台服务器上的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 的内容来做出相应的动作               //doSomethingsbreak;default:base.DefWndProc(ref m);break;}}catch(Exception ex){ShowLogInfo(ex.Message);}}

转载于:https://www.cnblogs.com/lpq21314/p/9512730.html

C# 进程之间的通讯相关推荐

  1. Android应用中通过AIDL机制实现进程间的通讯实例

    Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达 ...

  2. 初步理解Python进程的信号通讯

    Reference: http://www.jb51.net/article/63787.htm 信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信 ...

  3. linux:进程之间的通信

    ipc :进程间通信(InterProcess Communication) 1.管道 同一时间是单向的:父读子写,或父写子读  管道中的数据 ,读走就没了  参数是一个整型数的数组,数组的大小是两个 ...

  4. java多线程有几种实现方法_Java多线程之间实现通讯

    一.课程目标 多线程之间如何通讯 wait.notify.notifyAll()方法 lock 停止线程 守护线程 Join方法 优先级 Yield 二.多线程之间如何实现通讯 2.1 什么是多线程之 ...

  5. python 与别的程序通信_《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池...

    一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...

  6. 进程间的通讯(IPC)方式

    内存映射 为什么要进行进程间的通讯(IPC (Inter-process communication)) 数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数 ...

  7. 用WM_COPYDATA消息来实现两个进程之间传递数据

    文着重讲述了如果用WM_COPYDATA消息来实现两个进程之间传递数据. 进程之间通讯的几种方法: 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有   1.使用内存映 ...

  8. 线程与进程之间的共享资源

    线程和进程之间的共享资源方式 进程之间的共享资源的方式 1.消息队列 2.共享内存 3.管道(有名管道.无名管道) 4.信号 5.套接字 同一个进程的不同线程之间可以共享的资源 1.堆,由于堆是在进程 ...

  9. python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...

最新文章

  1. 数据结构与算法:选择排序
  2. ITK:计算纹理特征
  3. GraphQL入门之graphql-java项目的介绍
  4. 基于python的图像分割并计数
  5. Linux ALSA驱动框架(一)--ALSA架构简介--声卡的创建
  6. 信息周刊:随意设置电脑密码存在安全隐患
  7. 并发编程学习之原子变量类
  8. chrome浏览器截长图
  9. 每天一种设计模式之抽象工厂模式(Java实现)
  10. C语言多人对战贪吃蛇,双人对战贪吃蛇
  11. 初中物理浮力教学思考推荐
  12. BUUCTF web(三)
  13. iOS 权限提示语国际化
  14. stm32f407能跑linux吗_stm32能跑linux吗
  15. 机器学习——支持向量机——硬间隔与支持向量
  16. html5课件动画制作,从此再也不担心课件/动画的开发了!
  17. Group BOM 和BOM group
  18. HTML中引入外部CSS和JS
  19. 云图雅集—优美的诗词
  20. 知乎 mysql in 与 join_join和join in之间有什么区别?

热门文章

  1. ibatis查询CHAR类型的字段
  2. 简析TCP的三次握手与四次分手
  3. 协议森林01 邮差与邮局 (网络协议概观)
  4. 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
  5. [转]asp.net中常用的一些小技巧
  6. HCTF 2018:WarmUp(源代码详解)
  7. Vue watch如何同时监听多个属性?
  8. linux复制文件夹 实例,linux复制文件夹与文件实例介绍linux操作系统 -电脑资料
  9. 遍历一个数据去掉最后一个元素的样式
  10. Layui中设置公共的全局变量接口