将命令发送到无窗口命令行进程(从C#应用程序开始)

Iv4*_*v4n 5 c# command-line

我有一个启动的命令行应用程序,可以完成一些工作。在此期间,它会监听按键(s =>显示状态)。这不是在您按下's'和<ENTER>的典型命令提示符-它是在按下状态键时立即做出反应的类型。

现在,我试图通过发送击键来从精美的GUI应用程序“控制”该命令行应用程序。我尝试了更常规的方法来编写Process的StandardInput,但这似乎根本没有效果。另外,因为实际的过程没有窗口(它以CreateNoWindow = true开头),所以我无法尝试使用Win32 API将击键发送到窗口。

还有其他方法吗?

Iv4*_*v4n 1

好吧,我似乎找到了自己问题的答案。这是一个真正的“拼凑在一起”的解决方案,但它有效 - 并且对于我正在构建的应用程序的所有意图和目的来说,这并不重要。

所以,我所做的是使用两个 WinAPI 函数

static extern bool ShowWindow(IntPtr WindowHandle, int nCmdShow);
static extern bool SetForegroundWindow(IntPtr WindowHandle);
Run Code Online (Sandbox Code Playgroud)

第一个可用于通过将 nCmdShow 分别更改为 1 和 0 来显示/隐藏窗口。另一个将窗口(由 WindowHandle 确定)放在前面。将这两者结合在一起,我能够以编程方式将控制台窗口放在前面,执行一个简单的 SendKeys.Send(); 操作,然后再次隐藏。

// Use a WIN API command to bring the command line to front
SetForegroundWindow(workerProcess.MainWindowHandle);
// Send a keystore to re-display the STATUS of the worker
SendKeys.Send("s");
// Hide the window again.
ShowWindow(workerProcess.MainWindowHandle, 0); 
Run Code Online (Sandbox Code Playgroud)

现在,这确实是一项拼凑的工作,但它完成了工作。一个潜在的陷阱是,如果用户正在使用计算机执行其他操作,并且在窗口使用“q”处于活动状态时,会在 10000000 时刻内确定该 1 - 它将退出工作程序。但该应用程序旨在用于专用机器,这些机器很可能甚至不会连接显示器、键盘或鼠标,因此这不会成为问题。

感谢所有回答的人,因为您这样做了 - 以某种方式引导我找到正确的解决方案。