我拥有自己的控制台还是从父母那里继承了它?

时间:2011-05-18 17:30:36

标签: windows winapi console windows-nt

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

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


@anonymous downvoter:我可以根据一些反馈进行有限的扩展。说明不清楚的内容(但是,需要熟悉Windows内核和子系统)。请记住,我们这里的很多人都是程序员,所以我们的humour非常具体,不要判断标题双关语太苛刻。

1 个答案:

答案 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的不同方法是:

  • 确定您父母的进程ID(检查此问题的过去答案的stackoverflow!)
  • AttachConsole(pid),GetConsoleWindow()和FreeConsole()“窥视”您父进程正在使用的控制台HWND(如果有)。
  • 这样做的一个原因是一个进程一次只能连接到一个控制台 - 所以你必须在一个单独的帮助程序(!)中“偷看” - 否则你必须放手首先是你自己的控制台。

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

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