windows - 我拥有自己的控制台还是从 parent 那里继承的?

标签 windows winapi console windows-nt

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

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


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

最佳答案

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

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

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

但是使用“启动更多”,所以创建一个新的控制台,里面有更多,spy++ 报告说新窗口属于 more.exe。

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

--

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

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

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

[*本回答仅供娱乐,禁止等无效]

关于windows - 我拥有自己的控制台还是从 parent 那里继承的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6048690/

相关文章:

windows - 如何配置 Module::Build 以不将文件安装为只读?

c++ - 如何获取 WinRT 上的逻辑 CPU 数量?

delphi - 通过 Delphi 中的 Windows API 使用 COM 端口号获取设备名称

javascript - 查看源代码复制后 Leaflet Map JS 控制台出现问题

c++ - Qt从控制台读取并按Enter停止

c - 如果由服务映射,则网络驱动器不可用

java - Selenium - 使用 Windows 任务计划程序与命令行

c# - 如何将特定的 NTSTATUS 值转换为 Hresult?

console - 你如何配置Msys的默认大小、颜色和字体?

c# - 以 xamarin 形式将 base64 字符串绑定(bind)到 ListView