Этот цикл выполняет две разные вещи и использует 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'
завершит цикл.
Надежное решение:
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");
После того, как FindWindow используют GetWindowThreadProcessId, затем OpenProcess, затем TerminateProcess.
Еще после некоторого поиска с помощью 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");
}
Это работает на меня на 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 к проводнику вызывает, окна завершают работу диалогового окна.
Решение 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);
}