从c#启动和停止firefox

时间:2010-02-26 11:57:15

标签: c# firefox mono

当我开始

/Applications/Firefox.app/Contents/MacOS/firefox-bin

在使用Mono的Process.Start()的MacOSX上

,返回的进程的id与firefox最终运行的进程不匹配。

看起来firefox很快决定启动另一个进程,并杀死当前进程。

这使得很难阻止firefox,并检测它是否仍在运行。我尝试使用-no-remote标志启动firefox,但无济于事。

有没有办法以这样的方式启动firefox“我会快速为你制作一个新流程”跳舞?

通过确保Firefox在启动后保持运行至少3秒,可以在某种程度上检测到这种情况,当它不启动时,扫描其他firefox进程。然而,这种技术充其量是不稳定的,因为在缓慢的日子里它可能需要3秒多一点,然后所有依赖于这种行为的测试都会失败。

事实证明,只有在要求firefox使用-P MyProfile启动特定的配置文件时才会发生此行为。 (我需要这样做,因为我需要使用特定的代理服务器设置启动firefox)如果我“正常”启动firefox,它会坚持其进程。

4 个答案:

答案 0 :(得分:3)

在其他应用程序中以编程方式/嵌入方式使用mozilla时,您应该使用提供的组件:

mozilla推荐的“正确的方式”......

https://developer.mozilla.org/en/XPCOM

<简单的方法“,来自Mozilla开发人员的普遍共识......

http://www.iol.ie/~locka/mozilla/control.htm

需要“执行进程”,只需实例化组件的实例并与之交谈,然后就应该拥有所需的一切。

然而......

如果您确实坚持要为firefox实例查看实际进程,可能需要调用

的Process.Start( “... \ firefox.exe”);

然后尝试这个(我相信这也适用于MAC OS)......

C#/mono: get list of child processes on Windows and Linux

基本思想/思维模式是,如果它实际上正在执行另一个过程,你应该能够找到那个“子”过程,而不只是“任务列表”中列表中的一个/机器的进程管理器。

答案 1 :(得分:0)

如果您对Firefox进程本身的检测没有问题,但不知道何时应该开始检测,则可以使用Process.Exited事件。不要忘记先设置EnableRaisingEvents

答案 2 :(得分:0)

我建议采用不同的方法:列出所有正在运行的进程,查找Firefox,获取进程ID和(可选)查看它是否是您启动的进程。

我不确定是否有与平台无关的方法来实现这一目标。在Linux上,您可以调用“ps -ef”列出它们,在Windows上称为“任务列表”。

答案 3 :(得分:0)

我没有Mac,所以我不能确定,但​​如果它像Linux一样,firefox'binary'实际上是一个shell脚本,它设置了一堆必需的环境变量并检查firefox是否已经运行(如果是的话,它会尝试向现有实例添加一个新选项卡,据我所知)。

您可以在脚本中捕获新的PID,但如果您更新它,请注意它在升级过程中被覆盖。