none
两个WPF进程,其中一个关闭另一个立马就能知道(信号) RRS feed

  • 问题

  • 之前的想法,就是类似System.Threading.WaitHandle 之类的系统级信号锁,开出两个,让两个进程抢占,并WaitOne,只要抢到了说明其中一个进程关闭了。

    可是经过测试,进程关闭的确会释放WaitHandle的引用,但是却不会Release信号锁。

    如何做到这一点呢?前提是,两个项目可以指定guid类似的标识Name,进程名不确定,启动目录不确定。


    Just 4 Love


    2017年3月22日 1:20

全部回复

  • 检测进程退出,参考下这个 Detecting Process Exit From Console Application in C#

    http://geekswithblogs.net/mrnat/archive/2004/09/23/11594.aspx

    代码摘抄

    // Declare the SetConsoleCtrlHandler function
    // as external and receiving a delegate.

    [DllImport("Kernel32")]
    public static extern boolSetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);

    // A delegate type to be used as the handler routine
    // for SetConsoleCtrlHandler.
    public delegate boolHandlerRoutine(CtrlTypes CtrlType);

    // An enumerated type for the control messages
    // sent to the handler routine.
    public enumCtrlTypes
    {
        CTRL_C_EVENT = 0,
        CTRL_BREAK_EVENT,
        CTRL_CLOSE_EVENT,
        CTRL_LOGOFF_EVENT = 5,
        CTRL_SHUTDOWN_EVENT
    }

    private static boolConsoleCtrlCheck(CtrlTypes ctrlType)
    {
        // Put your own handler here
        return
    true;
    }

    ...

    SetConsoleCtrlHandler(newHandlerRoutine(ConsoleCtrlCheck), true);


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年3月22日 4:22
  • 还有一种方法

    http://stackoverflow.com/questions/262280/how-can-i-know-if-a-process-is-running

    找到进程(Process.GetProcessesByName("notepad")),然后给这个进程注册Exited事件

    void RegisterProcessExit(Process process)
    {
        // NOTE there will be a race condition with the caller here
        //   how to fix it is left as an exercise
        process.Exited += process_Exited;
    }
    
    static void process_Exited(object sender, EventArgs e)
    {
       Console.WriteLine("Process has exited.");
    }


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年3月22日 4:25