在C#中获取进程的MainWindowHandle

时间:2009-07-16 14:45:01

标签: c# process

我在c#中开始一个这样的过程:

 Process p= new Process();
 p.StartInfo.FileName = "iexplore.exe";  
 p.StartInfo.Arguments = "about:blank";
 p.Start();

有时我已经有一个运行Internet Explorer的实例(我无法控制的东西),当我尝试抓住p的MainWindowHandle时:

p.MainWindowHandle

我得到一个例外,说该过程已经退出。

我正在尝试获取MainwindowHandle,以便将其附加到InternetExplorer对象。

如何在运行多个IE实例的情况下完成此操作?

2 个答案:

答案 0 :(得分:1)

如果流程尚未启动或已经关闭,则Process.MainWindowHandle仅引发异常。

所以你必须抓住这种情况的例外。

private void Form1_Load(object sender, EventArgs e)
{

    Process p = new Process();
    p.StartInfo.FileName = "iexplore.exe";
    p.StartInfo.Arguments = "about:blank";
    p.Start();

    Process p2 = new Process();
    p2.StartInfo.FileName = "iexplore.exe";
    p2.StartInfo.Arguments = "about:blank";
    p2.Start();

    try
    {
        if (FindWindow("iexplore.exe", 2) == p2.MainWindowHandle)
        {
            MessageBox.Show("OK");
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Failed: Process not OK!");
    }    
}


private IntPtr FindWindow(string title, int index)
{
    List<Process> l = new List<Process>();

    Process[] tempProcesses;
    tempProcesses = Process.GetProcesses();
    foreach (Process proc in tempProcesses)
    {
        if (proc.MainWindowTitle == title)
        {
            l.Add(proc);
        }
    }

    if (l.Count > index) return l[index].MainWindowHandle;
    return (IntPtr)0;
}

答案 1 :(得分:1)

您使用的是IE8吗?如果是这样,那么您调用的iexplore.exe将生成另一个子进程,然后立即退出。您的Process对象将保存一个指向exited的链接。

有关详细信息,请参阅此处:How to obtain process of newly created IE8 window?