Откройте окно проводника с помощью Process.Start, создающее избыточные процессы explorer.exe. - PullRequest
0 голосов
/ 23 апреля 2020

Когда я запускаю окно проводника с путем к каталогу, запускается новый процесс explorer.exe. После выхода из моей программы процесс explorer.exe остается открытым, что нормально, но когда я закрываю это окно обозревателя, процесс не закрывается. Если в моей программе появилось несколько проводников windows, у меня останется много процессов explorer.exe, которые останутся без изменений, даже когда все проводники windows закрыты.

ProcessStartInfo startInfo = new ProcessStartInfo("explorer.exe", folderPath);
Process.Start(startInfo);

enter image description here

Однако, если бы я запустил только файл explorer.exe без второго аргумента, дополнительный процесс explorer.exe не был бы создан, даже если открыто окно проводника. Когда это окно исследования закрыто, вы также не видите никакого дополнительного процесса explorer.exe, кроме процесса рабочего стола. Обратите внимание, что мой рабочий стол explore.exe - это PID 7704, и этот пример должен быть запущен только один.

ProcessStartInfo startInfo = new ProcessStartInfo("explorer.exe", folderPath);
Process.Start(startInfo);

enter image description here

Я обнаружил, что это правда, если я запускаю запуск вручную с помощью cmd.exe. В командной строке, если вы запустите «explorer.exe C: /», вы можете создать этот же «висячий» процесс explorer.exe, а просто «explorer.exe» - нет.

Мой вопрос заключается в том, как открыть окно проводника для нужной папки, не создавая все эти дополнительные процессы explorer.exe. Мне также интересно, удастся ли «висящим» процессам explorer.exe в конечном итоге go отойти самостоятельно или они будут сидеть там и захватывать всю память, пока мне не придется принудительно завершить задачу. До сих пор я видел, как они сохранялись в течение нескольких дней и никогда не уходили, даже если после закрытия windows с ними больше не связывался исследователь windows.

Единственное, о чем я могу думать, так это откройте файл explorer.exe без аргументов, чтобы он не создавал дополнительный процесс, затем каким-то образом найдите способ найти этот дескриптор окна открытого проводника, а затем используйте его, чтобы перейти к нужному каталогу. Я видел некоторые DLLImport ("user32.dll"), которые могли бы сделать это.

Звучит гораздо сложнее, чем просто использовать Process.Start, чтобы сразу попасть в нужную папку. Я просто не думаю, что для моей программы будет хорошей идеей оставить много процессов утечки памяти, хотя это то, что вы уже можете сделать с помощью cmd.exe. Я не знаю, является ли это Windows «функцией», которая в конечном итоге заканчивается нехваткой памяти.

1 Ответ

0 голосов
/ 23 апреля 2020

Вот решение, которое не создает никаких дополнительных процессов explorer.exe и использует существующий, как кажется.

Я понял это при открытии папки из командной оболочки. При запуске «explorer c: \ temp» создается новый файл explorer.exe. Но при запуске "start c:\temp" ..

Таким образом, следующий код запускает скрытый процесс cmd, передает свой ввод "start <folder>\r\n", а затем "exit\r\n", чтобы закрыть его. Код также проверяет утечку нового процесса cmd.

Надеюсь, это поможет.

Process cmd = new Process()
{
    StartInfo = new ProcessStartInfo()
    {
        FileName = "cmd",
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardInput = true
    }
};
cmd.Start();
int processId = cmd.Id;
Debug.WriteLine("PID: {0}", processId);
cmd.StandardInput.Write("start " + folderPath + "\r\n");
cmd.StandardInput.Write("exit\r\n");
cmd = null;

try
{
    Process isCmdStillThere = Process.GetProcessById(processId);
}
catch (Exception errorQueryingProcess)
{
    Debug.Assert(errorQueryingProcess.Message == "Process with an Id of " + processId + " is not running.");
}
...