gpt4 book ai didi

c# - 如何检测当前登录用户是否正在运行进程?

转载 作者:行者123 更新时间:2023-11-30 22:28:42 25 4
gpt4 key购买 nike

环境 - C#、.net 4.0、VS 2010

您好,我已经为 Windows 编写了一个简单的 shell 替代品。当用户登录时,shell 会自动启动。当用户退出我的 shell 时,会启动正常的 Windows“explorer.exe”。

现在,当用户退出时(并正确支持这一点),我需要能够检查“explorer.exe”是否正在为当前登录用户运行。这可以防止代码不必要地再次启动它,从而导致出现“Windows 资源管理器”应用程序窗口。

我见过无数关于如何检查和查看进程是否正在运行的示例......但没有看到它是否正在为当前登录用户运行。

下面的代码将检查“explorer.exe”是否已经在运行,如果没有则启动它。但有些情况下,这段代码在不需要时会测试为阳性!

例如,当使用快速用户切换时...另一个用户登录到机器,结果“explorer.exe”显示在进程列表中。但是,当“explorer.exe”正在运行时,它不会为当前登录的用户运行!所以当我的 shell 退出时,代码测试是肯定的,并且“explorer.exe”没有启动。留给用户的是黑屏,没有 shell !

那么,我如何修改下面的代码来测试“explorer.exe”是否正在为当前登录的用户运行?

Process[] Processes = Process.GetProcessesByName("explorer");
if (Processes.Length == 0)
{
string ExplorerShell = string.Format("{0}\\{1}", Environment.GetEnvironmentVariable("WINDIR"), "explorer.exe");
System.Diagnostics.Process prcExplorerShell = new System.Diagnostics.Process();
prcExplorerShell.StartInfo.FileName = ExplorerShell;
prcExplorerShell.StartInfo.UseShellExecute = true;
prcExplorerShell.Start();
}

最佳答案

您可以从进程中获取 SessionID,然后查询 Processes 并获取具有相同 SessionID 的 Explorer 实例,假设您的程序名为“NewShell”:

  Process myProc = Process.GetProcesses().FirstOrDefault(pp => pp.ProcessName.StartsWith("NewShell"));
Process myExplorer = Process.GetProcesses().FirstOrDefault(pp => pp.ProcessName == "explorer" && pp.SessionId == myProc.SessionId);

if (myExplorer == null)
StartExplorer()

顺便说一句。如果您使用 ProcessName.StartsWith("NewShell") 而不是 ProcessName == "NewShell" 那么它也可以在 VS 调试器下工作(它将 vshost 添加到 exe)

关于c# - 如何检测当前登录用户是否正在运行进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com