我有一些服务器(c#console app),现在我正在写一个管理器(winform app)来管理它们。我停在服务器关机上了。为此,我需要向每个服务器发送一个“shutdown”命令,它看起来像“/ quit”或“/ exit”。
“运行”方法:
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”语句。
这段代码工作正常。
接下来我试图关闭服务器而Server.Kill()
不是我这样做的方式bcs我需要保存所有服务器的数据。
我的“退出”方法:
public static void ExitServer()
{
if (!Server.HasExited)
{
Server.StandardInput.WriteLine(@"/exit");
Server.StandardInput.Flush();
Server.StandardInput.Close();
}
}
...而且...它不起作用bcs标准输入/输出需要重定向(Exception告诉我)。好吧,在“运行”方法中取消注释两行,它启动但控制台不输出任何内容,“退出”方法正常工作。 所以,我的问题是,我应该怎么做才能返回控制台输出? 感谢。
答案 0 :(得分:0)
感谢大家的回复。通过在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();
}
}