Из приложения 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());
Это делает то, что мне нужно, но чувствует себя очень хрупким и хакерским, и, вероятно, медленно.
Есть ли лучший, более элегантный способ?