如何获取FireFox新创建的窗口处理程序?

时间:2010-03-22 17:41:07

标签: c# .net winapi

我有一个新的System.Diagnostics.Process,它启动了FireFox。如何获得该窗口的处理程序?任何想法 - C#,winAPI函数......任何事情(只是不是ASM;))

3 个答案:

答案 0 :(得分:3)

启动该过程后,您可以调用process.Refresh()process.MainWindowHandle属性最终将包含应用程序主窗口的本机窗口句柄。

在开始填充它之后,您可能需要等待一段时间。

以下是一些代码:

Process process = new Process();
// Fill process.StartInfo
process.Start();

do
{
    System.Threading.Sleep(100);
    process.Refresh();
}
while(process.MainWindowHandle == IntPtr.Zero && !process.HasExited);

if(!process.HasExited)
{
    IntPtr hwnd = process.MainWindowHandle;
    // Do whatever you need to do with hwnd
}

答案 1 :(得分:0)

例如......我这样做:

IntPtr hwnd = IntPtr.Zero;
            System.Diagnostics.Process browserProc  = new System.Diagnostics.Process();
            browserProc.StartInfo.FileName = getDefaultBrowser();
            browserProc.StartInfo.Arguments = webBrowser1.Url.ToString();
            browserProc.StartInfo.UseShellExecute = true;
            browserProc.Start();

            do{
                Thread.Sleep(100);
                browserProc.Refresh();
            } while (browserProc.MainWindowHandle == IntPtr.Zero && !browserProc.HasExited);

            if (!browserProc.HasExited)
            {
                hwnd = browserProc.MainWindowHandle;
                browserProc.WaitForInputIdle();
                MoveWindow(browserProc.MainWindowHandle, p.X, p.Y, this.Width, this.Height, true);
                UpdateWindow(browserProc.MainWindowHandle);
            }

什么?我收到一条错误信息,如果FF已经打开(但是,我必须说,当它不是,一切都很好)。

答案 2 :(得分:0)

好的,我找到了命令,但这不是解决方案...... 我找到了启动窗口新实例的命令,它们工作正常,直到它们都没有启动。如果我启动了任何浏览器alreadi实例,那么应用程序崩溃并显示消息“进程已完成,因此请求的信息不可用”。 启动窗口的新实例(仅限firefox),但是aplication不会接收句柄并崩溃......

那么,有什么想法吗?这是代码:

private void button2_Click(object sender, EventArgs e)
    {
        Point p = this.Location; 
        this.HideBrowser(); 
        IntPtr hwnd = IntPtr.Zero;
        string arguments = string.Empty;
        string browser = getDefaultBrowser(); // phisical path to default browser

        if (browser.Contains("firefox"))
            arguments = "-new-window " + webBrowser1.Url.ToString();

        if (browser.Contains("opera"))
            arguments = "-newwindow " + webBrowser1.Url.ToString();

        if (browser.Contains("iexplore"))
            arguments = "-nomerge " + webBrowser1.Url.ToString();

        if (browser.Contains("chrome"))
            arguments = "-app-launch-as-panel " + webBrowser1.Url.ToString();

            System.Diagnostics.Process browserProc  = new System.Diagnostics.Process();
            browserProc.StartInfo.FileName = browser; 
            browserProc.StartInfo.Arguments = arguments;
            browserProc.StartInfo.UseShellExecute = true; 
            browserProc.Start(); // запускаем процесс

            do{
                Thread.Sleep(100);
                browserProc.Refresh();
            } while (browserProc.MainWindowHandle == IntPtr.Zero && !browserProc.HasExited);

            if (!browserProc.HasExited)//если что-то поймали
            {
                hwnd = browserProc.MainWindowHandle;
                browserProc.WaitForInputIdle();
                MoveWindow(browserProc.MainWindowHandle, p.X, p.Y, this.Width, this.Height, true);//устанавливаем новые координаты окна
                UpdateWindow(browserProc.MainWindowHandle);

            }

    }