C#中判断控制台进程输出结束及输入就绪的技术求助
终端模拟器输入状态检测问题求解
我正在基于WPF和C#开发一款终端模拟器,采用现有终端项目中的WinPTY组件,目标是在命令执行过程中需进一步输入的场景下,自动收集包括中间输出在内的所有命令结果。
项目的核心难点在于判断控制台进程何时准备好接收输入,以此确认输出已完成。我尝试过多种方法:
- 线程状态分析
- 性能计数器监控
- 进程栈检查
- Windows API Hook
其中重点尝试了注入DLL拦截ReadConsoleA调用,虽然IsInstalled方法显示注入成功,但自定义的MyReadConsoleA方法始终未触发。我对这个领域比较陌生,是参考相关教程进行操作的。
随着对问题的理解深入,我发现很难找到能明确识别进程等待用户输入的可靠方法,转而考虑检测ConsoleWriteA这类操作或许能满足测试需求。但之前已经排查并排除了两倍于上述数量的方法,均因可靠性或可行性不足而放弃,迫切需要更简单、可靠的解决方案,恳请各位提供思路或替代方案。
以下是我代码中与参考教程不同的片段,可能是问题所在:
[DllImport("KernelBase.dll", CharSet = CharSet.Ansi, SetLastError = true)] static extern bool ReadConsoleA(IntPtr hConsoleInput, StringBuilder lpBuffer, uint nNumberOfCharsToRead, out uint lpNumberOfCharsRead, IntPtr lpReserved); static bool MyReadConsoleA(IntPtr hConsoleInput, StringBuilder lpBuffer, uint nNumberOfCharsToRead, out uint lpNumberOfCharsRead, IntPtr lpReserved) { LogToFile("MyReadConsoleA called"); try { ((InjectionEntryPoint)HookRuntimeInfo.Callback).Interface.ReadCalled(); } catch (Exception ex) { ((InjectionEntryPoint)HookRuntimeInfo.Callback).Interface.HandleError(ex); } return ReadConsoleA(hConsoleInput, lpBuffer, nNumberOfCharsToRead, out lpNumberOfCharsRead, IntPtr lpReserved); } namespace Delegates { [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true)] public delegate bool ReadConsoleA(IntPtr hConsoleInput, StringBuilder lpBuffer, uint nNumberOfCharsToRead, out uint lpNumberOfCharsRead, IntPtr lpReserved); }
相关代码文件位置:
- 完整DLL代码:
ConsoleReadObserver/InjectionEntryPoint.cs - 注入点:
src/tterm/Ansi/WinPty.cs中的StartObserving()方法 - DLL与模拟器间消息传递类:
src/tterm/Remote/RemoteControl.cs
内容的提问来源于stack exchange,提问作者Sharp336
相关产品推荐
相关产品推荐

