Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Запуск браузера в новом окне


Автор: Pritorian 19.3.2010, 16:14
Здравствуйте, возникла следующая проблема, буду благодарен если посоветуете решение.
Есть пара координат (х, у... допустим 450 200), есть размеры окна (height, width... например 100 100).

Каким образом запустить новое окно стандартного браузера (прописанного в системе) так, чтобы окно встало на координаты х,у и имело соответствующий размер.
Пробовал смотреть System.Diagnostics.Process - всё хорошо, но увы, ничего похожего на Location не нашёл.
Проблема собственно не в запуске дефолтного браузера, а именно с установкой его размеров и позиционированием.

Спасибо за внимание.

Автор: CYBERDREAM 19.3.2010, 17:36
Приветствую.
http://www.markhneedham.com/blog/2008/08/10/controlling-window-position-with-the-win32-api/ как раз то что тебе нужно

Автор: Pritorian 19.3.2010, 18:12
Спасибо, полезная ссылка, хотя как всегда с накладками. Буду разбираться.
Будут ещё предложения?

Автор: CYBERDREAM 19.3.2010, 18:16
Какие накладки и зачем еще предложения?

Автор: Pritorian 19.3.2010, 18:32
Я создаю свой процесс следующим образом:

Код


private void button2_Click(object sender, EventArgs e)
        {
          
            using (System.Diagnostics.Process browserProc = new System.Diagnostics.Process())//создаём процесс, который запустит браузер по умолчанию
            {
                browserProc.StartInfo.FileName = webBrowser1.Url.ToString();//передаём процессу ссылку
                browserProc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;

                tagWINDOWINFO info = new tagWINDOWINFO();
                info.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(info);
                
                browserProc.Start();//запускаем процесс
                
                GetWindowInfo(browserProc.MainWindowHandle, ref info); // а вот тут возникает ошибка, No process is associated with this object
                               
                browserProc.WaitForInputIdle();
                string str = browserProc.MainWindowTitle;
                MoveWindow(browserProc.MainWindowHandle, 100, 100, 100, 100, true);//координаты просто для теста
                UpdateWindow(browserProc.MainWindowHandle);

            }
        }


Автор: Dobermann 19.3.2010, 18:57
Зацени 3D браузер 
http://chriscavanagh.wordpress.com/2009/08/27/wpf-3d-chromium-browser/ 
и забей WinForms smile 

Автор: Pritorian 19.3.2010, 23:05
Странно на самом деле, что не получается получить хэндлер... Делая выборку по активным процессам, окно открывшееся там присутствует...

Автор: Pritorian 21.3.2010, 14:11
Таки решил эту проблему... вся ерунда оказалась в том, что окно тупо не успевало подвязываться на процесс. Такие вот дела. Вот код, который запускает страничку в ИЕ с заданными координатами и шириной. Моет кому-то тоже пару дней сэкономит:

Код

//Команда,  необходимая для перемещения окна
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
        //Команда, необходимая для отображения окна с новыми координатами
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern bool UpdateWindow(IntPtr hWnd);


        
        private void button2_Click(object sender, EventArgs e)
        {
            Point p = this.Location; //получили координаты формы, относительно которой позиционируем браузер
                       
                System.Diagnostics.Process browserProc  = System.Diagnostics.Process.Start("IEXPLORE.EXE", "-nomerge "+webBrowser1.Url.ToString());//запускаем процесс в новом окне ИЕ
                                                       
                while (browserProc.MainWindowHandle == IntPtr.Zero)//пока винда не ассоциировала окно с процессом
                {
                    Thread.Sleep(50);// ждём 50 мс
                    browserProc.Refresh();// обновялем процесс
                }
             
                //как только получили дескриптор окна, начинаем манипуляции с ним
                                              
                browserProc.WaitForInputIdle();
                MoveWindow(browserProc.MainWindowHandle, p.X, p.Y, this.Width, this.Height, true);//устанавливаем новые координаты окна
                UpdateWindow(browserProc.MainWindowHandle);// обновляем окно
        }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)