2010-02-26 51 views
5

停止Firefox时,我MacOSX上开始,并从C#

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

使用的Process.Start()使用单声道的进程的ID开始返回的结果与firefox最终运行的进程不匹配。

它看起来像Firefox迅速决定开始另一个进程,并杀死当前的一个。

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

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

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

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

+0

请注意,如果一个实例已经在运行,您可能会看到相同的行为。 Firefox显然不喜欢多个进程太多,所以它决定将每个窗口塞进一个进程 - 使得这种方式更有趣的崩溃:) – Joey 2010-02-26 12:17:28

+0

最糟糕的情况下,使用另一个浏览器;) – 2010-05-18 14:44:25

回答

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

的基本思想/思维模式是,如果它实际上是在执行另一个进程的时候了,你应该能够发现,作为将是一个“孩子”的过程,而不是被刚刚从列表中选择一个在机器的“任务列表”/进程管理器中。

0

如果您确定检测到Firefox进程本身,但不知道何时应该启动检测,则可以使用Process.Exited事件。不要忘记先设置EnableRaisingEvents

0

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

我不确定是否有平台无关的方式来完成此操作。在Linux上,你可以调用“ps -ef”来列出它们,在Windows上称为“tasklist”。

0

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

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