Активировать существующее окно браузера с указанным URL из приложения C# (без запуска перезагрузки)
Из приложения 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 ответ
Это будет работать, ЕСЛИ у пользователя этот сайт активен в браузере. Если они используют браузер с вкладками и сайт открыт, но не на выбранной вкладке, я не верю, что вы когда-нибудь найдете окно браузера. (EnumWindows перечисляет только окна верхнего уровня).
Если пользователь запустил новую вкладку, вы в конечном итоге не найдете ее и (скорее всего) запустите вторую копию сайта на новой вкладке.
Лично, если вам действительно нужно ограничиться одним экземпляром браузера, я бы подумал, возможно ли встроить браузер в ваше приложение вместо использования браузера по умолчанию. Если бы это можно было сделать элементом GUI в вашем приложении, используя элемент управления браузера, у вас было бы гораздо больше контроля и вы могли бы избежать обходного пути такого типа.