0

我有 ac# 表单应用程序。当这个表单从任务管理器的进程中关闭时,我必须在我的表单应用程序中做一些事情。可能吗?

如果我误导了任何事情,我深表歉意。但我需要这个解决方案。

4

4 回答 4

5

你不能。为了跟踪这种情况,您可以做的是在启动时在操作系统保证写入许可的目录中创建一些隐藏文件,并在应用程序关闭时删除该文件。

这样,如果在您的应用程序启动时,您会发现隐藏文件,这意味着该应用程序以非正常方式关闭。因此,您可以相应地执行一些操作。

希望这可以帮助。

于 2013-05-09T09:15:04.507 回答
1

任务管理器将首先尝试优雅地关闭您的应用程序。你会得到一个正常的关闭信号,你可以采取行动。在可能对应于主窗口的 OnClose/Closing 的表单应用程序中。如果该信号没有及时结束应用程序,任务管理器将终止该进程。您将无法拦截或对其采取行动。

于 2013-05-09T09:14:34.660 回答
1

据我所知,使用任务管理器终止进程是立即的。
该应用程序无法以任何方式获得通知。

任务管理器一般调用 Windows API ExitProcess 来杀死进程。

关于如何hook API,可以参考: http: //www.codeproject.com/KB/system/hooksys.aspx

资源

在替代方案中,您可以创建一个额外的进程来观察主应用程序,如果他发现应用程序已关闭,则执行某些操作。如果主应用程序正常关闭,则从主应用程序中终止该进程。这可能是一个简单的解决方法。

于 2013-05-09T09:14:49.850 回答
1

“不,你不能,但你可以做的就是在处理表单之前做一些事情。msdn.microsoft.com/en-us/library/...。你到底想归档什么?——”

更新

根据您对我的评论的回复:

如果你做其他事情怎么办。创建一个 Windows 服务(守护进程)来检查您的窗体何时打开(Win​​dows 名称),然后监视窗体以检查它何时关闭,并在发生这种情况时调用您需要的 Web 服务。

您的 Windows 服务将像这样简单:

        Thread thread = new Thread(() =>
        {
            while (!formClosed)
            {
                if (!Process.GetProcesses().Any(x => x.MainWindow.Title.Contains(windowName)))
                {
                    //form closed, call your web service
                }

                Thread.Sleep(5000);
            }
        });
于 2013-05-09T09:50:50.710 回答