2

我目前正在编写一个应用程序来操作已经构建的现有控制台应用程序。目前我能够启动现有的应用程序,然后写入控制台并接收输出。但我需要我的应用程序基本上保持控制台应用程序在后台运行,并保持应用程序打开并准备向窗口写入新命令以接收更多信息。以下是我正在使用的当前代码。我想知道是否有办法在启动时调用此代码来启动控制台应用程序。

代码

   private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        string ApplicationPath = "python";
        string ApplicationArguments = "Console/dummy.py";
        string returnValue;

        //Process PyObj = new Process();
        ProcessStartInfo PyObjStartInfo = new ProcessStartInfo();

        PyObjStartInfo.FileName = ApplicationPath;
        PyObjStartInfo.Arguments = ApplicationArguments;
        PyObjStartInfo.RedirectStandardInput = true;
        PyObjStartInfo.RedirectStandardOutput = true;
        PyObjStartInfo.UseShellExecute = false;
        //PyObjStartInfo.CreateNoWindow = true;

        //PyObj.StartInfo = PyObjStartInfo;

        Thread.Sleep(5000);

        using (Process process = Process.Start(PyObjStartInfo))
        {
            StreamWriter sw = process.StandardInput;
            StreamReader sr = process.StandardOutput;

            if (sw.BaseStream.CanWrite)
            {
                sw.WriteLine("auth");
            }
            sw.Close();
            sw.Close();
            returnValue = sr.ReadToEnd();
            MessageBox.Show(returnValue.ToString());
        }
        //Thread.Sleep(5000);
        //PyObj.WaitForExit();
        //PyObj.Close();
    }

正如您所看到的,这当前使用了一个按钮单击,但我希望代码在我的应用程序启动后立即运行。然后保持控制台应用程序运行并在内存中,以便我可以与之交互。有没有办法在 C#.net 中做到这一点?

以供参考。我调用的控制台应用程序是空白的,暂时只返回虚拟答案。这是下面的 Python 代码。

蟒蛇代码

  import os, pprint

def main():
    keepGoing = True
    while keepGoing:
      response = menu()
      if response == "0":
          keepGoing = False
      elif response == "auth":
          print StartAuthProcess()
      elif response == "verify":
          print VerifyKey(raw_input(""))
      elif response == "get":
          print Info()
      else:
          print "I don't know what you want to do..."

def menu():
    '''
    print "MENU"
    print "0) Quit"
    print "1) Start Autentication Process"
    print "2) Verify Key"
    print "3) Get Output"

    return raw_input("What would you like to do? ")
    '''
    return raw_input();
def StartAuthProcess():
    return 1;

def VerifyKey(key):
    if(key):
        return 1;
    else:
        return 0;

def Info():
    info = "{dummy:stuff}";
    return info;

main()
4

1 回答 1

1

有几个地方可以放置可以立即运行的代码。首先,您将看到具有您的static void Main功能的 Program.cs。那是您的应用程序开始执行的地方。直到调用Application.Run(). 这是放置早期初始化内容的好地方。

如果您希望在首次打开表单时发生某些事情,您可以覆盖虚拟Form.OnShown方法:

protected override void OnShown(EventArgs e) {
    base.OwnShown(e);

    // Call whatever functions you want here.
}

请注意,您真的不应该像Sleep在 GUI 线程(也就是您的按钮单击处理程序)中那样使用任何阻塞调用。这将导致您的 GUI 挂起,并且感觉没有响应。我不确定您计划如何与后台进程交互(它是自动的还是用户驱动的?)但是任何阻塞调用(即从标准输出读取)都应该发生在后台线程上。然后,您可以使用Control.Invoke将调用编组回 UI 线程以更新控件等。

于 2013-03-22T05:37:39.327 回答