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