gpt4 book ai didi

c# - 在 C++ 中获取另一个进程的 session ID

转载 作者:太空狗 更新时间:2023-10-29 20:42:14 25 4
gpt4 key购买 nike

当我启动我的应用程序时,我试图弄清楚是否有另一个应用程序进程。我还尝试弄清楚它是否在不同的用户 session 中运行。

到目前为止一切顺利,这就是它在 C# 中的样子:

    private static bool isThereAnotherInstance() {
string name = Path.GetFileNameWithoutExtension(Application.ExecutablePath);
Process[] pAll = Process.GetProcessesByName(name);
Process pCurrent = Process.GetCurrentProcess();
foreach (Process p in pAll) {
if (p.Id == pCurrent.Id) continue;
if (p.SessionId != pCurrent.SessionId) continue;
return true;
}
return false;
}

但是要求已经改变,我需要这段使用普通 WinAPI 的 C++ 代码。

到目前为止,我可以使用 CreateToolhelp32SnapshotOpenProcess 等找到具有相同可执行路径的进程。

缺少的部分是如何获取进程的 session ID(当前和其他进程,以及当前和其他 session )
如何做到这一点?

最佳答案

ProcessIdToSessionId函数将进程 ID 映射到 session ID。

您注意到这似乎需要 .Net 不需要的过多权限。

.Net 确实从注册表中的 HKEY_PERFORMANCE_DATA 获取了一些进程数据,但这不包括 session ID。使用 NtQuerySystemInformation 获取 session ID返回一组 SYSTEM_PROCESS_INFORMATION 结构。这个结构没有很好的记录,但是 session ID 紧跟在句柄计数之后(即它是当前声明为 BYTE Reserved4[4]; 的字段)。 Microsoft 不保证在未来的 Windows 版本中这将继续如此。

关于c# - 在 C++ 中获取另一个进程的 session ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19427665/

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