检测应用程序是否启动了另一个进程
本文关键字:另一个 进程 启动 应用程序 是否 检测 | 更新日期: 2023-09-27 18:17:32
应用程序的卸载程序通常会启动新进程,我试图让我的应用程序知道它,所以如果在卸载后,它将执行一些任务。
以NSIS为例。
string uninstallstring = "C:''Program Files (x86)''Pidgin'uninstall.exe"; // reg.GetValue("UninstallString").ToString();
Process p = new Process()
{
StartInfo = new ProcessStartInfo()
{
FileName = uninstallstring
},
EnableRaisingEvents = true
};
p.Start();
p.WaitForExit();
Debug.WriteLine(p.HasExited);
Debug.WriteLine(p.ExitCode);
// clean up TASKS after uninstall here
// clean clean clean
上面的
代码将尝试卸载Pidgin。它将启动(),它应该等待卸载程序完成它的工作,并在调试面板中显示True/False (HasExited)以及它的ExitCode。
问题是,Start()执行后,"uninstall.exe"启动了一个新的应用程序"Au_.exe"在"C:'Users'Jayson'AppData'Local'Temp'~nsu.tmp"answers"uninstall.exe"关闭,WaitForExit()已经完成了它的工作和调试面板显示
True
0
这些是"HasExited"answers"ExitCode",但Pidgin Uninstall仍在运行,这告诉我"Uninstall .exe"启动了"Au_.exe",而不是他的子进程。
我的问题是,我如何确保卸载程序完成它的工作?
如果您知道由unninstaller启动的应用程序的名称,您可以尝试使用计时器检查Process.GetProcessesByName("Au_.exe")
的进程是否存在。当进程出现然后消失时,您可以引发回调。你还可以阅读GetExitCodeProcess
我认为这里没有通用的解决方案。你依赖的外部组件不像预期的那样工作(通常我们期望uninstall.exe只会在完全卸载后退出并返回相应的错误代码,但它没有)。
有几个解决方法:
-
当uninstall.exe完成后,寻找Au_.exe进程并等待其完成
-
在uninstall.exe(也可能是Au_.exe)之后检查是否真的卸载了Pidgin。您可以检查文件系统或一些特殊的注册表项。在执行自定义清理任务之前,您可能会有所期待。如果没有正确卸载-重复或不清理(可能显示一些错误或写日志消息-这取决于你的应用程序)。
-
为Pidgin制作自定义卸载程序,将清理所有必要的资源。Pidgin是开源的,所以你可以看看它的安装程序是如何工作的。也许仅仅修改现有的安装程序就足够了。
-
不要担心Au_.exe,只是清理你的资源-可能这对你的应用程序来说真的不是问题。
-
(如果可能)要求您的应用程序的用户卸载Pidgin。当用户这样做-做一些简单的检查(例如:C:/Program Files/Pidgin被删除),并做你的清理。