У меня есть форма windows, и я делаю следующий вызов, чтобы открыть chrome с URL:
string uri = Uri.EscapeUriString(URL.ToString());
Process process = Process.Start("chrome", uri + " --new-window");
return process.Id;
Проблема заключается в том, что я получаю сообщение об ошибке: «Процесс с идентификатором «xxxxxxx» не работает », когда я вызываю следующее:
procsChrome = Process.GetProcessById(processID);
Идентификатор процесса - это тот, который возвращен в предыдущем фрагменте кода. Теперь, это работает, когда у меня НЕТ CHROME ОКНА ОТКРЫТО.
Но если у меня открыто другое окно chrome, я получаю эту ошибку. Я наблюдал за процессами в диспетчере задач, и когда chrome не открыто, создается новый процесс с идентификатором процесса, возвращенным из фрагмента кода 1.
Когда один или несколько chrome windows созданы уже открыт, я получаю идентификатор процесса из фрагмента кода 1, но недавно открытое окно chrome работает под другим идентификатором. Почему это происходит?
Редактировать 2:
Вот метод, по которому я получаю ошибку. Параметр int processID
- это процесс. Идентификатор, возвращенный выше из фрагмента кода 1.
public static string GetCodeFromURL(int processID)
{
Process procsChrome = null;
try
{
if (processID == -1)
{
Console.WriteLine("-1 returned as ID");
return null;
}
procsChrome = Process.GetProcessById(processID); //I GET ERROR HERE
// the chrome process must have a window
if (procsChrome.MainWindowHandle == IntPtr.Zero)
MessageBox.Show("Process failed");
// to find the tabs we first need to locate something reliable - the 'New Tab' button
AutomationElement root = AutomationElement.FromHandle(procsChrome.MainWindowHandle);
var SearchBar = root.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "Address and search bar"));
if (SearchBar != null)
{
bool noCode = false;
while (noCode == false)
{
string fullURL = (string)SearchBar.GetCurrentPropertyValue(ValuePatternIdentifiers.ValueProperty);
if (!(fullURL.Contains("code") && fullURL.Contains("state")))
{
if (procsChrome.HasExited)
{
Console.WriteLine("Process failed. User closed browser.");
procsChrome.Close();
noCode = true;
}
}
else
{
string stateToken = HttpUtility.ParseQueryString(fullURL.Substring(new[] { 0, fullURL.IndexOf('?') }.Max())).Get("state");
if (stateToken.Equals("296bc9a0-a2a2-4a57-be1a-d0e2fd9bb601"))
{
noCode = true;
string code = HttpUtility.ParseQueryString(fullURL.Substring(new[] { 0, fullURL.IndexOf('?') }.Max())).Get("code");
procsChrome.CloseMainWindow();
procsChrome.Close();
return code;
}
}
}
}
}
catch (Exception exception)
{
Console.WriteLine("An exception occured on getting the URL. Please try again. The exception is: " + exception.ToString());
return null;
}
return null;
}
Спасибо.