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

时间:2014-09-16 10:31:00

标签: c#

我有一些服务器(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告诉我)。好吧,在“运行”方法中取消注释两行,它启动但控制台不输出任何内容,“退出”方法正常工作。 所以,我的问题是,我应该怎么做才能返回控制台输出? 感谢。

1 个答案:

答案 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();
        }
    }