【发布时间】:2017-03-28 21:31:59
【问题描述】:
我正在制作一个“简单”程序来关闭我在 Windows 10 上运行的所有活动应用程序,即 Chrome、Outlook、Notepadd++ 等。经过大量搜索后,我发现了以下代码:
foreach (Process p in Process.GetProcesses(Environment.MachineName))
{
if ((p.Id != CurrentProcess.Id && p.MainWindowHandle != IntPtr.Zero))
{
p.kill();
}
}
首先它要求进程用 p.CloseMainWindow() 很好地关闭,然后如果返回异常则终止进程。我知道这并不理想,但这在大多数情况下都有效。
运行我的程序时,它会关闭我的所有应用程序和一些底层 Windows 应用程序/进程,因为屏幕、任务栏和桌面会变黑一秒钟并刷新。
我的问题是,在我运行这个程序的一半以上的时间里,我得到了一个 Win32Exception 并且程序无法完成关闭任何打开的东西。
我在这里猜测这是因为我没有足够的权限来关闭 Windows 后台进程,即使以管理员身份运行也是如此,这就是我收到异常的原因。
在每次 kill 调用之后,我都会让程序休眠一小段时间,以便让进程有时间关闭,以避免在终止进程上调用 kill,这也会引发异常。可能时间不够用,我用的是 250ms 的间隔。
TL;DR 有没有办法关闭我(用户)已打开的所有内容(或任务栏中的所有内容)并保留主要 Windows 进程?
【问题讨论】:
-
所有具有从“shell”(explorer.exe)启动的父进程并具有与当前用户和会话相同的用户的所有内容。您还可以按窗口类型进行过滤以选择我们所说的应用程序。我不会使用 kill - 我会使用 p.CloseMainWindow。进一步思考.. 当您单击任务栏的最右侧时,“最小化所有窗口”操作如何工作?我想知道Shell API是否可以给你一个桌面窗口列表。
-
我首先使用 p.CloseMainWindow,但我经常收到错误,因为程序不支持它或没有“主窗口”,所以如果出现错误,我只会调用 kill,除非我错过了一些东西。感谢您的建议,我将查看 shell API,看看是否可以找到有关拥有当前用户和会话的进程列表的信息
标签: c# windows process win32exception