我拥有我的控制台还是从父母那里inheritance?

NT字符模式应用程序如何确定其控制台是否已从父进程inheritance,而不是CreateProcess中新分配的控制台?

哇,所以不受欢迎的标签! 添加窗口来吸引合适的程序员


@anonymous downvoter:我只能根据一些反馈来做这个问题的有限扩展。 状态不清楚(然而,熟悉Windows内核和子系统是必需的)。 请记住,我们这里很多是程序员,所以我们的幽默是非常具体的,不要判断标题太苛刻。

Solutions Collecting From Web of "我拥有我的控制台还是从父母那里inheritance?"

有些想法可能会或可能不会帮助 – 这不是一个真正的答案,但它太长,以适应评论。

您可以使用GetConsoleWindow()来确定您的控制台的HWND。 然后可以看看是否有其他人分享这个。 尝试调用它的GetWindowThreadProcessId – 在一些版本的Windows上,如果我记得正确,似乎这返回CSRSS进程的PID – 这是没有用的。 但似乎在Win7上,它返回最初拥有该窗口的进程的PID。

例如,我启动了一个CMD窗口,输入更多; 所以我们有cmd.exe和more.exe共享相同的窗口。 Spy ++报告HWND属于cmd.exe。

但是使用“多开始”,所以创建一个新的控制台,其中更多的,并间谍+ +报告,新窗口属于more.exe。

这可能是Win7中的新行为(或者至少在以前的版本中可能不一致),但是; 控制台窗口实际上由辅助进程拥有,Win7中的conhost.exe和以前版本中的csrss。 GetWindowThreadProcessId可能会返回以前版本的辅助进程的PID。 谁知道未来版本的Windows将会返回什么 – 控制台窗口是“特殊的”。

不依赖于GetWindowThreadProcessID的另一种方法是:

  • 确定你父母的进程ID(检查stackoverflow过去的答案这个问题!)
  • AttachConsole(pid),GetConsoleWindow()和FreeConsole()来查看你的父进程正在使用的控制台HWND(如果有的话)。
  • 与此相关的是,一个进程一次只能连接到一个控制台 – 所以你必须在单独的帮助程序(!)中“偷看”,否则你将不得不放手控制台第一。

长话短说,这可能是近似的,但不清楚,你真的想要“现实生活中”这样做; “暂停,如果没有参数”可能是最好的办法。

[*此答案仅用于娱乐目的,在禁止的情况下无效等]