Как программно перезапустить процесс Windows Explorer

Этот цикл выполняет две разные вещи и использует f для отслеживания того, что он делает. Это часто сбивает с толку, и код, вероятно, должен быть написан в виде двух отдельных циклов:

// skip until the decimal point
while ((ch = getchar()) != '\n' && ch != '.')
    ; // nothing to do here

// check that we haven't hit the end of the input
if (ch != '\n')
    // count digit characters
    while ((ch = getchar()) >= '0' && ch <= '9')
        ++num;

Обратите внимание, что в последнем цикле нет явной проверки для '\n'; в этом нет необходимости, потому что '\n' не будет между '0' и '9', поэтому получение '\n' завершит цикл.

7
задан Cœur 21 January 2019 в 10:04
поделиться

5 ответов

Надежное решение:

foreach (Process p in Process.GetProcesses())
{
    // In case we get Access Denied
    try
    {
        if (p.MainModule.FileName.ToLower().EndsWith(":\\windows\\explorer.exe"))
        {
            p.Kill();
            break;
        }
    }
    catch
    { }
}
Process.Start("explorer.exe");
5
ответ дан 6 December 2019 в 07:08
поделиться

После того, как FindWindow используют GetWindowThreadProcessId, затем OpenProcess, затем TerminateProcess.

1
ответ дан 6 December 2019 в 07:08
поделиться

Еще после некоторого поиска с помощью Google я предложил следующее решение C#:


using System.Diagnostics;
...
static public void RestartExplorer()
{
    foreach(Process p in Process.GetProcesses())  {
       if(p.MainModule.ModuleName.contains("explorer") == true)
         p.Kill();
    }
    Process.Start("explorer.exe");
}
1
ответ дан 6 December 2019 в 07:08
поделиться

Это работает на меня на Vista:

DWORD dwPID;
HANDLE hExp;
HWND hSysTray = ::FindWindow (TEXT("Shell_TrayWnd"), NULL) ;
GetWindowThreadProcessId (hSysTray, &dwPID);
hExp = OpenProcess (PROCESS_TERMINATE, FALSE, dwPID);

if (hExp)
{
   TerminateProcess (hExp, 0);
}
Sleep (2000);
ShellExecute (NULL, NULL, TEXT("explorer.exe"), NULL, NULL, SW_HIDE);

Но я не могу найти способ подавить исследовать окно, которое открывается (я попробовал, следовательно SW_HIDE). На Vista, выполняя explorer.exe без параметров, кажется, совпадает с под управлением "explorer.exe/e" в более ранних системах. Необходимо будет попробовать его за себя на XP, у меня нет его здесь.

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

1
ответ дан 6 December 2019 в 07:08
поделиться

Решение AC #, которое обеспечивает большую уверенность в том, что "правильные" процессы проводника будут убиты.

using System;
using System.Diagnostics;

...............

public static void RestartExplorer()
 {
 const string explorer = "explorer.exe";
 string explorerPath = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), explorer);
 foreach (Process process in Process.GetProcesses())
  {
  // In case we get Access Denied
  try
   {
   if (string.Compare(process.MainModule.FileName, explorerPath, StringComparison.OrdinalIgnoreCase) == 0)
    {
    process.Kill();
    }
   }
  catch
   {
   }
  }
 Process.Start(explorer);
 }
0
ответ дан 6 December 2019 в 07:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: