Как получить FireFox вновь созданный обработчик окна? - PullRequest
2 голосов
/ 22 марта 2010

У меня есть новый System.Diagnostics.Process, и он запускает FireFox. Как я могу получить обработчик этого окна? Любые идеи - C #, функции winAPI ... все (только не ASM;))

Ответы [ 3 ]

3 голосов
/ 22 марта 2010

Как только вы запустили процесс, вы можете вызвать 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
}
0 голосов
/ 23 марта 2010

Хорошо, я нахожу команды, но это не решение ... Я нахожу команды для запуска нового экземпляра окна, и они работают нормально, пока ни одна из них не будет запущена. Если у меня запущен какой-либо экземпляр браузера Alreadi, приложение перестало работать с сообщением «процесс завершен, поэтому запрашиваемая информация недоступна» Новый экземпляр окна запущен (только Firefox), но приложение не получает дескриптор и не работает ...

Итак, есть идеи? Вот код:

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);

            }

    }
0 голосов
/ 22 марта 2010

Например ... я делаю что-то вроде этого:

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 уже был открыт (но я должен сказать, что когда это не так, все в порядке)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...