NT字符模式应用程序如何确定其控制台是否已从父进程继承,而不是在CreateProcess中新分配的控制台?
哇,所以不受欢迎的标签!添加窗口以吸引合适的程序员@anonymous downvoter:我可以根据一些反馈进行有限的扩展。说明不清楚的内容(但是,需要熟悉Windows内核和子系统)。请记住,我们这里的很多人都是程序员,所以我们的humour非常具体,不要判断标题双关语太苛刻。
答案 0 :(得分:2)
一些可能有帮助但可能没有帮助的想法 - 这不是一个真正的答案,但是它太长而不适合评论。*
您可以使用GetConsoleWindow()来确定控制台的HWND。然后可以看看是否有其他人在分享。尝试在其上调用GetWindowThreadProcessId - 在某些版本的Windows上,如果我没记错的话,它似乎会返回CSRSS进程的PID - 这没有用。但似乎在Win7上,它返回最初拥有该窗口的进程的PID。
例如,我启动了一个CMD窗口,输入更多;所以我们让cmd.exe和more.exe共享同一个窗口。 Spy ++报告HWND属于cmd.exe。
但是使用“start more”所以创建一个包含更多内容的新控制台,spy ++报告新窗口属于more.exe。
这可能是Win7中的新行为(或者至少在以前的版本中可能不一致);控制台窗口实际上由辅助进程,Win7中的conhost.exe和以前版本中的csrss拥有。 GetWindowThreadProcessId可能会在先前版本上返回这些帮助程序进程的PID。谁知道它将在未来版本的Windows中返回什么 - 控制台窗口是“特殊的”。
-
不依赖于GetWindowThreadProcessID的不同方法是:
长话短说,有可能近似这个,但不清楚你真的想在现实生活中这样做“; “暂停,如果没有参数”可能是最好的方法。
[*此答案仅供娱乐用途,在禁止的情况下无效等]