C# 将文本从另一个应用程序传递到控制台
我有一些服务器c控制台应用程序,现在我正在编写一个管理器winform应用程序来管理它们。我陷入了服务器关闭的困境。为此,我需要向每台服务器发送一个shutdown命令,看起来像/quit或/exit 运行方法:C# 将文本从另一个应用程序传递到控制台,c#,C#,我有一些服务器c控制台应用程序,现在我正在编写一个管理器winform应用程序来管理它们。我陷入了服务器关闭的困境。为此,我需要向每台服务器发送一个shutdown命令,看起来像/quit或/exit 运行方法: public static void RunServer() { ProcessStartInfo serverInfo = new ProcessStartInfo(serverPath); serverInfo.UseShellExe
public static void RunServer()
{
ProcessStartInfo serverInfo = new ProcessStartInfo(serverPath);
serverInfo.UseShellExecute = false;
//serverInfo.RedirectStandardInput = true;
//serverInfo.RedirectStandardOutput = true;
using (Server = Process.Start(serverInfo))
{
if (!MainForm.Instance.InvokeRequired)
{
MainForm.Instance.ChangeServerState();
}
else
{
MainForm.Instance.Invoke(new ChangeButtonState(MainForm.Instance.ChangeServerState));
}
Server.WaitForExit();
}
}
不要注意if/else语句。
这段代码运行良好。
接下来,我将尝试关闭服务器和服务器。Kill不是我执行此操作的方法,因为我需要保存所有服务器的数据
我的退出方法:
public static void ExitServer()
{
if (!Server.HasExited)
{
Server.StandardInput.WriteLine(@"/exit");
Server.StandardInput.Flush();
Server.StandardInput.Close();
}
}
……还有。。。这不起作用,因为标准输入/输出需要重定向异常告诉我。好的,取消对Run方法中两行的注释,它正在启动,但控制台并没有输出任何内容,Exit方法工作正常。
所以,我的问题是,我应该如何返回控制台输出?
谢谢。谢谢大家的回复。在user.dll中使用InputSimulator和SetWindowPos解决了这个问题
private static void SimulateExitInput()
{
InputSimulator iS = new InputSimulator();
iS.Keyboard.TextEntry(@"/exit");
iS.Keyboard.KeyPress(WindowsInput.Native.VirtualKeyCode.RETURN);
}
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
const uint SWP_NOSIZE = 0x0001;
const uint SWP_NOMOVE = 0x0002;
const uint SWP_SHOWWINDOW = 0x0040;
private static void ActivateProcess(int PID)
{
Process proc = Process.GetProcessById(PID);
IntPtr mainWindow = proc.MainWindowHandle;
IntPtr newPos = new IntPtr(0); // 0 puts it on top of Z order. You can do new IntPtr(-1) to force it to a topmost window, instead.
SetWindowPos(mainWindow, new IntPtr(0), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
}
最后,退出方法如下所示:
public static void ExitServer()
{
if (Server == null)
{
return;
}
if (!Server.HasExited)
{
ActivateProcess(Server.Id);
SimulateExitInput();
}
}
我假设您只尝试过serverInfo.RedirectStandardInput=true,而没有重定向输出?您尝试过使用OWIN自托管吗。您可以创建一个web API控制器并将其托管在服务器应用程序中,然后您可以创建一个简单的restful API来控制它们。您可能还想看看topshelf,它使将控制台应用程序转换为windows服务变得很容易。关于serverInfo.RedirectStandartOutput=true,我尝试将其设置为false,我无法工作。关于OWIN,感谢您的回复,我将查看他。