Активировать существующее окно браузера с заданным URL из приложения C # (без запуска перезагрузки) - PullRequest
1 голос
/ 18 мая 2009

Из приложения C # я хочу активировать (в крайнем случае) сайт, который уже открыт в браузере пользователя по умолчанию. Я хочу сделать это независимо от браузера.

Трудная часть (по крайней мере для меня) состоит в том, что я не хочу, чтобы браузер открыл новую вкладку, и браузер не должен перезагрузить страницу, если она уже открыта .

Я могу открыть URI в браузере по умолчанию с помощью

System.Diagnostics.Process.Start("http://foo.example");

Но точное поведение зависит от браузера пользователя по умолчанию (кажется, что IE6 повторно использует текущее верхнее окно браузера, Google Chrome всегда открывает новую вкладку и т. Д.)

Другой подход, который я попробовал, состоял в том, чтобы перечислить все открытые Windows и найти тот, который я хочу, основываясь на заголовке окна (делая предположение, что большинство браузеров устанавливают заголовок окна на заголовок текущей открытой страницы)

public delegate bool EnumThreadWindowsCallback(int hWnd, int lParam);

[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll")]
static extern bool EnumWindows(EnumThreadWindowsCallback callback, IntPtr extraData);

[DllImport("user32.dll")]
static extern int GetWindowText(int hWnd, StringBuilder text, int count);

private bool FindWindowByRx(int hWnd, int lParam)
{
    Regex pattern = new Regex("Example Title of Page", RegexOptions.IgnoreCase);
    StringBuilder windowTitle = new StringBuilder(256);
    GetWindowText(hWnd, windowTitle, 255);

    if (pattern.IsMatch(windowTitle.ToString()))
    {
        SetForegroundWindow(new IntPtr(hWnd));
        return false; // abort search
    }
    else
    {
        return true; // keep on searching
    }
}

используя его с:

EnumWindows(new EnumThreadWindowsCallback(FindWindowByRx), new IntPtr());

Это делает то, что мне нужно, но чувствует себя очень хрупким и хакерским, и, вероятно, медленно.

Есть ли лучший, более элегантный способ?

1 Ответ

1 голос
/ 18 мая 2009

Это будет работать, ЕСЛИ у пользователя этот сайт активен в браузере. Если они используют браузер с вкладками и сайт открыт, но не на выбранной вкладке, я не верю, что вы когда-нибудь найдете окно браузера. (EnumWindows перечисляет только окна верхнего уровня).

Если пользователь запустил новую вкладку, вы в конечном итоге не найдете ее и (скорее всего) запустите вторую копию сайта на новой вкладке.

Лично, если вам действительно нужно ограничиться одним экземпляром браузера, я бы подумал, возможно ли встроить браузер в ваше приложение вместо использования браузера по умолчанию. Если бы это можно было сделать элементом GUI в вашем приложении с помощью элемента управления браузера, у вас было бы гораздо больше контроля и вы могли бы избежать обходного пути такого типа.

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