NT 字符模式应用程序如何确定其控制台是否是从父进程继承的,而不是在 CreateProcess 中新分配的控制台?
哇,这么不受欢迎的标签!添加窗口以吸引合适的程序员
@anonymous downvoter:我可以仅根据一些反馈对这个问题进行有限的扩展。说明不清楚的内容(但是需要熟悉 Windows 内核和子系统)。请记住,我们这里很多人都是程序员,所以我们的幽默非常具体,不要判断标题双关语太严厉。
一些想法可能有帮助,也可能没有帮助 - 这并不是真正的答案,但它太长,无法放入评论中。*
您可以使用 GetConsoleWindow() 来确定控制台的 HWND。然后可以看看是否有其他人在分享。尝试在其上调用 GetWindowThreadProcessId - 在某些版本的 Windows 上,如果我没记错的话,这似乎会返回 CSRSS 进程的 PID - 这没有帮助。但似乎在Win7上,它返回最初拥有该窗口的进程的PID。
例如,我启动了一个CMD窗口,然后输入了more;所以我们有 cmd.exe 和 more.exe 共享同一个窗口。 Spy++ 报告 HWND 属于 cmd.exe。
但是使用“start more”,因此创建一个包含 more 的新控制台,spy++ 报告新窗口属于 more.exe。
然而,这可能是 Win7 中的新行为(或者至少可能与以前的版本不一致);控制台窗口实际上由一个辅助进程拥有,Win7 中为 conhost.exe,以前版本中为 csrss。 GetWindowThreadProcessId 可能会返回以前版本中这些辅助进程的 PID。谁知道它会在未来版本的 Windows 中返回什么 - 控制台窗口是“特殊的”。
--
不依赖 GetWindowThreadProcessID 的另一种方法是:
长话短说,也许可以近似这一点,但不清楚你是否真的想“在现实生活中”这样做; “如果没有参数则暂停”可能是最好的方法。
[*此答案仅供娱乐,禁止等情况无效]
您可以尝试
GetConsoleProcessList
,第一个进程将是发出请求的进程,第二个进程是父进程,但如果它已退出(例如start.exe
),则列表链将中断,并且它将仅包含当前正在运行的进程.
尽管当我使用 Sysinternals Process Explorer 检查进程时,它在“线程”选项卡中显示
ConEmuHk64.dll
。当我正常运行我的应用程序时,该函数报告 ConEmuC64.exe <= Far.exe <= ConEmuC64.exe
进程(没有第一个进程),或者从标准 Windows 终端运行时报告 cmd.exe
或 powershell.exe
。
所以实际上进程可能会退出,但控制台仍然是继承的