Как правило, невозможно «привязать аргументы к существующему процессу». Вам понадобятся некоторые знания о соответствующем приложении и реализация индивидуальных решений.
Однако с IE (как в вашем примере) вам повезло, так как им можно управлять с помощью COM. См. Ответ от adriaanp для получения чистого решения.
Опять же, если у вас сегодня плохое настроение, возможно, вам будет проще реализовать решение. Это ни в коем случае не правильный способ сделать это, и при этом он не гарантированно работает при любых обстоятельствах, но я видел нечто подобное, используемое в рабочем коде.
Идея состоит в том, чтобы использовать Win API, чтобы найти окно браузера, найти адресную строку и ввести свой URL - дешево, не так ли ?! Таким образом, вы устраняете все COM-зависимости и мгновенно переходите.
Вот некоторый код (есть только один публичный метод DoPopup
, который вы вызываете с помощью URL и некоторой части заголовка окна браузера (вы можете использовать другие средства, чтобы получить дескриптор окна браузера, если вы как)):
static class PopupHelper
{
class SearchData
{
public readonly String Criterion;
public IntPtr ResultHandle;
public SearchData(String criterion)
{
Criterion = criterion;
ResultHandle = IntPtr.Zero;
}
}
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumWindows(EnumWindowsProc callback, ref SearchData data);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool EnumChildWindows(IntPtr window, EnumWindowsProc callback, ref SearchData data);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern int GetClassName(IntPtr handle, StringBuilder result, int length);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr handle, StringBuilder result, int length);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr windowHandle);
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr windowHandle, UInt32 Msg, IntPtr wParam, StringBuilder lParam);
delegate bool EnumWindowsProc(IntPtr hWnd, ref SearchData data);
static IntPtr SearchForWindowByTitle(string title)
{
SearchData searchData = new SearchData(title);
EnumWindows(new EnumWindowsProc(delegate(IntPtr handle, ref SearchData searchDataRef)
{
StringBuilder candidate = new StringBuilder(1024);
GetWindowText(handle, candidate, candidate.Capacity);
if (!candidate.ToString().Contains(searchDataRef.Criterion)) { return true; }
searchDataRef.ResultHandle = handle;
return false;
}), ref searchData);
return searchData.ResultHandle;
}
static IntPtr SearchForChildWindowByClassName(IntPtr parent, string className)
{
SearchData searchData = new SearchData(className);
EnumChildWindows(parent, new EnumWindowsProc(delegate(IntPtr handle, ref SearchData searchDataRef)
{
StringBuilder candidate = new StringBuilder(64);
GetClassName(handle, candidate, candidate.Capacity);
if (candidate.ToString() != searchDataRef.Criterion) { return true; }
searchDataRef.ResultHandle = handle;
return false;
}), ref searchData);
return searchData.ResultHandle;
}
static void NavigateToUrlInExistingBrowserWindow(IntPtr browserWindowHandle, IntPtr addressEditBoxHandle, string url)
{
StringBuilder addressBuilder = new StringBuilder(url);
const uint WM_SETTEXT = 0x000C;
const uint WM_KEYDOWN = 0x0100;
const uint RETURN_KEY = 13;
SendMessage(addressEditBoxHandle, WM_SETTEXT, IntPtr.Zero, addressBuilder);
SendMessage(addressEditBoxHandle, WM_KEYDOWN, new IntPtr(RETURN_KEY), null);
SetForegroundWindow(browserWindowHandle);
}
public static void DoPopup(string url, string captionPart)
{
IntPtr windowHandle = SearchForWindowByTitle(captionPart);
if (windowHandle != IntPtr.Zero)
{
IntPtr addressEditBoxHandle = SearchForChildWindowByClassName(windowHandle, "Edit");
if (addressEditBoxHandle != IntPtr.Zero)
{
NavigateToUrlInExistingBrowserWindow(windowHandle, addressEditBoxHandle, url);
return;
}
}
Process.Start("iexplore", url);
}
}