【问题标题】:Do i own my console or i inherited it from my parent?我拥有我的控制台还是从父母那里继承了它?
【发布时间】:2011-05-18 17:30:36
【问题描述】:

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

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


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

【问题讨论】:

  • 不知道为什么这会被否决?甚至在扩展和标题更改之前,问题就很清楚了?仅仅因为它不是日常的“我如何在 JavaScript 中输出 Hello World”问题并不意味着它不是一个有效的问题?困惑。
  • @Michael Stum,是的。我还意识到 [winnt] 标签的参与者很少,[console] 与 Windows 控制台的相关性较低,而且 [windows] 太宽泛了,而问题本身有点与语言无关,但我没能找到更好的标签集。如果您知道更好的组合,请重新标记问题。感谢您的反馈和打破沉默,顺便说一句:-)
  • 好奇你为什么要这样做?我认为没有简单的方法可以做到这一点。可能有一种解决方法,但取决于你想要做什么,可能会有更好的方法完全......
  • @BrendanMcK,我的兴趣更可能是一般性的,而不是具体的。但是考虑一个我产生这种兴趣的例子:最终用户从资源管理器执行了一些字符模式应用程序,程序检测到没有有效的命令行并打印使用指南然后退出。在 NT(与保留控制台窗口的 Win9x 不同)中,所有这些操作几乎完全没用,除了给用户一点提示(通过闪烁控制台窗口)从 cmd(作为父进程)重复它。当然,我可以检测特定情况(因为没有参数)并等待输入,但一般的解决方案应该会好得多

标签: windows winapi console windows-nt


【解决方案1】:

一些可能有用也可能没用的想法 - 这不是真正的答案,但它太长了,不适合 cmets。*

您可以使用 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 的另一种方法是:

  • 确定您父级的进程 ID(查看 stackoverflow 以了解该问题的过去答案!)
  • AttachConsole(pid)、GetConsoleWindow() 和 FreeConsole() 以“查看”您的父进程正在使用的控制台 HWND(如果有)。
  • 这个问题是一个进程一次只能附加到一个控制台 - 所以你必须在一个单独的帮助进程中“窥视”(!) - 否则你必须放手首先是您自己的控制台。

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

[*此答案仅供娱乐,禁止时无效等]

【讨论】:

  • 为什么你觉得这不是一个答案?我认为这是一个很好的答案。
  • 虽然这可能是有趣的信息,但我想明确表示我实际上并不建议在现实世界的代码中使用这些技术——它们看起来有些脆弱。这里的价值在于它让您了解控制台的工作原理;但它实际上并没有按要求回答原始问题。并且可能有一个我不知道的实际答案......所以它不是一个答案,而是一个回答说可能没有[好的]答案 - 具有讽刺意味的是,这可能是最好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
相关资源
最近更新 更多