Как повторно использовать существующее/уже открытое окно проводника Windows для запуска проводника

У меня есть приложение, которое часто использует запуск explorer.exe. Я хотел бы повторно использовать существующие/уже открытые окна проводника вместо создания нового каждый раз, когда я запускаю процесс.

Вот как выглядит мой код:

System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo
{
    UseShellExecute = true,
    FileName = "Explorer.exe",
    Arguments = myDirectoryPath
};
System.Diagnostics.Process.Start(info);

Я не видел переключателя командной строки для этого. Один из подходов, который я пробовал, заключался в том, чтобы просто убить любой 1 существующий процесс проводника и заменить его новым:

var processes = System.Diagnostics.Process.GetProcesses(Environment.MachineName);int kills = 0;
for (int i = 0; i < processes.Length; i++)
{
    System.Diagnostics.Process p = processes[i];
    if (p.ProcessName == "explorer" && kills < 1)
        ++kills
    p.Kill();
}

Но это приводит к нежелательному эффекту не только уничтожения 1 процесса, но и полного уничтожения проводника, так что даже панель задач исчезает.

Итак, как использовать существующее окно проводника, если оно существует, для запуска проводника?


person T. Webster    schedule 28.01.2011    source источник
comment
Что произойдет, если у вашего пользователя окно проводника открыто для каталога по какой-то другой причине, и он не хочет, чтобы его удаляли из этого каталога? Как вы думаете, может ли такой подход разочаровать ваших пользователей?   -  person Phil    schedule 28.01.2011
comment
Это серьезная проблема, тем не менее, мои пользователи сказали, что они просто сказали, что хотят повторно использовать любые существующие окна проводника, вместо того, чтобы мое приложение каждый раз открывало новые копии. В противном случае мне пришлось бы точно определять, какие окна проводника были открыты моим приложением, и повторно использовать только их.   -  person T. Webster    schedule 28.01.2011
comment
См. также stackoverflow.com/questions/3010305/   -  person rogerdpack    schedule 24.09.2013
comment
Я реализовал это на С# в этом ответе.   -  person Marcelo Scofano Diniz    schedule 28.11.2020


Ответы (3)


COM-интерфейс IShellWindows предоставит вам список открытых окон проводника, вы можете получить и установить адрес любого окна проводника, см. эта запись в блоге для примера C++. Я сомневаюсь, что .NET имеет встроенную реализацию этого, поэтому вам, вероятно, нужно PInvoke

person Anders    schedule 28.01.2011
comment
Это может быть полезно, я посмотрю, хотя я искал что-то большее, чем вот фрагмент кода, как это сделать... - person T. Webster; 29.01.2011
comment
так что на самом деле нет опции командной строки для повторного использования ранее существующих окон? странный... - person rogerdpack; 31.08.2012

Другим вариантом может быть (если вы не знаете HWND окна проводника, которое вы уже открыли / хотите использовать повторно) перечислить и найти окно с заголовком, который «выглядит» как то, что вы хотите, а затем указать этому окну прийти к передний план. Это не покажет точный файл, который вы хотите в нем, но это может быть проще, чем другие варианты :)

person rogerdpack    schedule 31.08.2012

Это слишком сложно, так что не делайте этого. Попробуйте это вместо этого-

taskkill /f /im explorer.exe`

Если вам нужно запустить его снова, нажмите Ctrl+Shift+Esc, затем нажмите «Файл», затем «Создать новую задачу», затем введите cmd, [убедитесь, что сначала установлен флажок «Создать эту задачу с правами администратора». !], затем нажмите OK или нажмите Enter, затем введите следующий код:

start explorer.exe

Теперь необходимо перезапустить explorer.exe!

person Community    schedule 12.11.2019