5

我有一个应用程序。如果应用程序在 15 分钟内未使用,则需要关闭所有其他应用程序(强制关闭)并重新启动计时器。我不想这样做会使 Windows 7 崩溃。到目前为止,我有以下内容:

Process me = Process.GetCurrentProcess();
foreach (Process p in Process.GetProcesses())
{
    if (p.Id != me.Id 
        && p.ProcessName != "winlogon.exe" 
        && p.ProcessName != "explorer.exe"
        && p.ProcessName != "System Idle Process"
        && p.ProcessName != "taskmgr.exe"
        && p.ProcessName != "spoolsv.exe"
        && p.ProcessName != "csrss.exe"
        && p.ProcessName != "smss.exe"
        && p.ProcessName != "svchost.exe "
        && p.ProcessName != "services.exe"
    )
    {
        p.Kill();
    }
}

可悲的是窗户死了(蓝屏)。有什么办法可以关闭所有进程以供主动使用,然后希望 Windows 可以生存。

4

4 回答 4

4

首先,在公用 PC 上设置自动登录。

然后,您的程序只需要重新启动。

如果您设置稳定状态或使用Deep FreezeSystem SafeTime Freeze等产品,则会获得奖励积分。这些产品甚至可以选择在一段时间不活动后将计算机重新启动到干净状态......

于 2011-02-22T01:30:26.170 回答
3

在这里保证安全的最简单方法是保留应用程序启动时存在的那些进程的列表,并将这些进程排除在 kill 之外。但是,取决于您的应用程序何时启动(例如,如果它不是系统启动的一部分),这可能会让一些应用程序漏掉。从好的方面来说,它将允许设备(例如鼠标和键盘处理程序)的用户模式挂钩继续运行,这意味着系统在您杀死所有内容后仍然可用。

您可以尝试广播消息,但如果 Windows 阻止它,WM_CLOSE我不会感到惊讶。它只会对具有可见窗口的进程产生影响,但这可能就足够了。

第三种选择是强制注销ExitWindowsEx,让操作系统处理关闭所有内容。当然,这也会关闭你自己的应用程序并强制用户重新登录。如果您设置了自动登录,那么它可能会直接重新登录。

于 2011-02-21T22:30:34.763 回答
2
if (p.Id != me.Id
    && !p.ProcessName.ToLower().StartsWith("winlogon")
    && !p.ProcessName.ToLower().StartsWith("system idle process")
    && !p.ProcessName.ToLower().StartsWith("taskmgr")
    && !p.ProcessName.ToLower().StartsWith("spoolsv")
    && !p.ProcessName.ToLower().StartsWith("csrss")
    && !p.ProcessName.ToLower().StartsWith("smss")
    && !p.ProcessName.ToLower().StartsWith("svchost")
    && !p.ProcessName.ToLower().StartsWith("services")
    && !p.ProcessName.ToLower().StartsWith("lsass")
)
{
    if (p.MainWindowHandle != IntPtr.Zero)
    {
        p.Kill();
    }                          
}

这似乎奏效了。

于 2011-02-21T23:38:04.827 回答
1

您显然正在杀死 Windows 运行所需的重要进程。如果你杀死这些,Windows 将无法恢复(正如你已经意识到的那样)并且需要重新启动。

于 2011-02-21T22:20:16.440 回答