Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将文本从另一个应用程序传递到控制台_C# - Fatal编程技术网

C# 将文本从另一个应用程序传递到控制台

C# 将文本从另一个应用程序传递到控制台,c#,C#,我有一些服务器c控制台应用程序,现在我正在编写一个管理器winform应用程序来管理它们。我陷入了服务器关闭的困境。为此,我需要向每台服务器发送一个shutdown命令,看起来像/quit或/exit 运行方法: public static void RunServer() { ProcessStartInfo serverInfo = new ProcessStartInfo(serverPath); serverInfo.UseShellExe

我有一些服务器c控制台应用程序,现在我正在编写一个管理器winform应用程序来管理它们。我陷入了服务器关闭的困境。为此,我需要向每台服务器发送一个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语句。 这段代码运行良好。 接下来,我将尝试关闭服务器和服务器。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,感谢您的回复,我将查看他。