我正在尝试从c#代码启动浏览器实例作为进程。然后我想杀死浏览器的同一个实例。我尝试使用进程ID查找相同的实例。但是进程id在任务管理器和我开始进程时获得的初始id是不同的。 什么是解决方案?为什么会这样?发展环境是Windows 7。
int ID= 0;
void Start()
{
ProcessStartInfo startInfo = new ProcessStartInfo("iexplore.exe");
startInfo.Arguments = "http://www.google.com";
Process ieProcess = Process.Start(startInfo);
ID= ieProcess.Id;
}
void Stop()
{
foreach (Process p in System.Diagnostics.Process.GetProcessesByName("iexplore"))
{
if ((p.Id == ID))
{
p.Kill();
}
}
答案 0 :(得分:1)
如果IE已经启动,此代码将无效。关闭所有IE浏览器,然后尝试运行代码。如果它有效,那么您可能需要查找以下链接中建议的解决方案
类似的帖子 - Process.kill() denied in Windows 7 32bits even with Administrator privileges
答案 1 :(得分:0)
为什么不在问题中添加代码?它会让那些有兴趣帮助你的人生活轻松。如果你得到不同的PID,很可能你的代码有问题! (我只是在猜测你没看过你尝试过的东西。)
也要看看这些问题
1) Getting PID of process started by Process.start()
2) Programmatically kill a process in vista/windows 7 in C#
3) Process.kill() denied in Windows 7 32bits even with Administrator privileges
添加代码可以更容易地理解问题所在,这就是你的问题。
IE为该程序的一个实例创建了多个进程。 (more details about it)这就是为什么你得到不同的PID(针对不同的过程)。
你的代码所做的只是杀死它的一个进程(通过在if
方法中使用Stop()
条件!)。因此,当您尝试再次执行Start()
(开始相同的过程)时,剩余的流程可能会生成InvalidOperationException!
因此,您的代码应该执行的操作是终止所有活动的iexplore
进程。只需删除if
方法的Stop()
条件即可完成此操作。
foreach(Process p in Process.GetProcessesByName("iexplore"))
{
p.Kill();
}
让我知道这是否有效。
答案 2 :(得分:0)
我有一个类似的问题,只是我不想杀死我开始的IE进程,我想把它引入焦点。 我有一个应用程序启动5个IE窗口。(不是标签,但独特的窗口) 我存储了每个IE窗口启动的PID。 在特定时间,我希望能够:
使用XP和IE6(环境所需) 现在,当我使用Win 7和IE 8时,找不到我存储的PID, 因此我不再能够改变焦点窗口。