1

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

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


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

4

1 回答 1

2

一些可能有帮助也可能没有帮助的想法 - 这不是一个真正的答案,但它太长了,无法放入评论中。*

您可以使用 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(如果有)。
  • 这样做的问题是,一个进程一次只能附加到一个控制台 - 所以你必须在一个单独的帮助进程中“窥视”(!) - 否则你必须放弃你自己的先控制台。

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

[*此答案仅用于娱乐目的,禁止时无效等]

于 2011-05-25T09:32:59.327 回答