使用Singleton类实现关闭客户端应用程序

时间:2013-04-23 05:15:23

标签: c# .net visual-c++

我有一个用c#编写的.net应用程序。从使用c ++编写的父应用程序调用此应用程序。当父应用程序崩溃或意外关闭时,.net应用程序仍然运行。但是,当父应用程序崩溃或停止时,我也希望关闭客户端应用程序。

我的一位同事说我们可以使用单例类轻松实现这一点。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您将不得不轮询以查看父应用程序是否仍在运行。

执行此操作的一种方法是通过在Windows中配置审核进程跟踪来设置运行应用程序的时间。以下链接可以帮助您入门:

  

Audit process tracking

     

How can I track what programs come and go on my machine?

进程跟踪将在Windows事件日志中创建条目,然后您可以使用C ++,C#和/或VB.Net进行访问。您可以使用这些日志来查看Parent应用程序是否正在运行。

编辑:

如果您有权访问C ++代码库,您可以尝试在父应用程序崩溃或关闭时捕获异常,例如:

Application.ThreadException += new ThreadExceptionEventHandler(ApplicationThreadException);

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ApplicationUnhandledException);


private void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
    //Write to a File, Registry, Database flagging the application has crashed
}
private void ApplicationUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    //Write to a File, Registry, Database flagging the application has crashed
}

private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
    //Write to a File, Registry, Database flagging the application has closed
}

否则,您必须进行轮询以查看是否在流程管理器中列出了父应用程序,例如:

StringBuilder sb = new StringBuilder();
ManagementClass MgmtClass = new ManagementClass("Win32_Process");

foreach (ManagementObject mo in MgmtClass.GetInstances())
{
    sb.Append("Name:\t" + mo["Name"] + Environment.NewLine);
    sb.Append("ID:\t" + mo["ProcessId"] + Environment.NewLine);
    sb.Append(Environment.NewLine);
}

如果未列出,请关闭子应用程序。

答案 1 :(得分:0)

首先,当父窗口引发异常或关闭时,您必须捕获事件。 其次,您将发送关闭已通过父窗口启动的进程的消息。 有关发送关闭消息的信息,请参考此处: Send message to a Windows process (not its main window)

how to close a window from a different process