C# - процесс с идентификатором "xxxxxx" не запущен - PullRequest
0 голосов
/ 31 марта 2020

У меня есть форма 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;
    }

Спасибо.

1 Ответ

0 голосов
/ 31 марта 2020

Не уверен, почему chrome ведет себя так. Можете ли вы попробовать запустить свой код chrome в режиме инкогнито?

Используя приведенный ниже тестовый код, я смог запустить 2 разных процесса инкогнито, каждый со своим собственным идентификатором процесса. Примечание: они запускаются в том же окне браузера, что и 2 вкладки.

Я думаю, использование --incognito избавит вас от неприятностей.

  public class LaunchChromeProof
  {
    private readonly ITestOutputHelper _output;

    public LaunchChromeProof(ITestOutputHelper output)
    {
      _output = output;
    }

    [Fact]
    public void CanLaunchChromeIcognito_AndFetchProcesses_ByID()
    {
      var chromePath = @"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe";
      var chromeProcess = Process.Start(chromePath, "www.google.com --incognito");
      Assert.NotEqual(0, chromeProcess.Id);


      //launch a second session
      var chrome2ndProcess = Process.Start(chromePath, "www.google.com --incognito");
      Assert.NotEqual(0, chrome2ndProcess.Id);

      _output.WriteLine($"Session 1 ProcessID: {chromeProcess.Id}");
      _output.WriteLine($"Session 2 ProcessID: {chrome2ndProcess.Id}");



      //check we can fetch the correct process by the process id for each session
      var fetchProcess1 = Process.GetProcessById(chromeProcess.Id);
      Assert.Equal(chromeProcess.Id, fetchProcess1.Id);

      var fetchProcess2 = Process.GetProcessById(chrome2ndProcess.Id);
      Assert.Equal(chrome2ndProcess.Id, fetchProcess2.Id);

      _output.WriteLine($"Fetched Session 1 Process: {fetchProcess1.Id}");
      _output.WriteLine($"Fetched Session 2 Process: {fetchProcess2.Id}");
    }

test results

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