You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:47:18