Kidades
Kidades

Reputation: 670

Use Chrome or Firefox in Winforms application ?

Is there a way to use Firefox or Chrome (whichever is installed) in a .NET application? I am not thinking about putting gecko or webkit engine in my application but using the browser installed on the system instead (just like the WebBrowser control uses IE). I heard that it is possible via ActiveX controls but didn't find any more info about it.

Upvotes: 2

Views: 4671

Answers (1)

Daniel Abou Chleih
Daniel Abou Chleih

Reputation: 2469

Well you could use user32.dll to set the parent window of the specified child window (here firefox or chrome).

This is what the result look likes: enter image description here First of all I have two small problems and 1 bigger one:

  1. As you can see firefox is not maximized, therefore some content is missing (still looking for a way to fix that [help appriciated])

  2. Because you have to start the process first and then set the parent of the window, Firefox is running outside of your application for a small amount of time.

  3. The biggest problem: The program your are trying to "bind" to your application mustn't run when running your application, because it cannot set the parent of firefox to your program

MSDN for explanation of the methods: http://msdn.microsoft.com/en-us/library/windows/desktop/ff468919(v=vs.85).aspx

[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int nWidth, int nHeight, bool repaint);
//hwnd: A handle to the window | x: The new position of the left side of the window. | y: The new position of the top of the window.
//nWidth: The new width of the window. | nHeight: The new height of the window. 
//repaint: Indicates whether the window is to be repainted. If this parameter is TRUE, the window receives a message. If the parameter is FALSE, no repainting of any kind occurs.
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

Process ffprocess = new Process();
        private void openProgramAndSetParent()
        {
            string str = @"C:\Program Files\Mozilla Firefox\firefox.exe"; //Enter full path to Firefox or Chrome

            ffprocess.StartInfo.FileName = str;
            ffprocess.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
            ffprocess.Start();

            IntPtr ptr = IntPtr.Zero;
            while ((ptr = ffprocess.MainWindowHandle) == IntPtr.Zero)
            {
                Application.DoEvents();
            }
            Thread.Sleep(1000);
            SetParent(ffprocess.MainWindowHandle, panel1.Handle);
            MoveWindow(ffprocess.MainWindowHandle, 0, 0, this.Width, this.Height -100, true);
        }

    private void Form1_Resize(object sender, EventArgs e)
    {
        try
        {
            MoveWindow(ffprocess.MainWindowHandle, 0, 0, this.Width, this.Height, true);
        }
        catch (Exception)
        {}
    }

Upvotes: 2

Related Questions