背景:
winform 的项目。一个解决方案下面有两个程序:一个winform项目,一个控制台项目。在winform 中有两个按钮,按钮A是开始,按钮B 是结束。按钮 A 可以启动控制台程序。
在控制台项目中,有三个方法,一个是连接,一个是登录,一个是发送。 当点击winform 上的按钮A 后,会启动 控制台项目,然后执行连接,登录,发送操作。
问题:
问题一:当按钮A 执行完控制台之后,控制台依旧不关闭,等待下一次输入。 按按钮B 时,不会启动一个新的控制台程序,而是使用之前的控制台。
问题二:按钮B启动之后,连接和登录保持,所以不需要操作,只需要执行发送命令
问题三:控制台如何保持等待输入状态,直到手动关闭控制台程序。
代码:
winform:
butonA:
Process cmd = new Process();
cmd.StartInfo.FileName = @"xxxxx";
cmd.Start();
控制台:
class Test
{
public void Connection(){}
public striing login(){}
public void send(){}
}
class Program
{
static void Main(string[] args)
{
}
}
求一个思路!
控制台
using System;
using System.Runtime.InteropServices;
namespace WindowsFormsApp1
{
class Test
{
public void Connection() { Console.WriteLine("Conn"); }
public string login() { Console.WriteLine("Login"); return "OK"; }
public void send() { Console.WriteLine("send"); }
}
public class cmdApp
{
Test test;
//static Test test = new Test();
public cmdApp() { test = new Test(); }
public void Connection() { test.Connection(); }
public string login() { return test.login(); }
public void send() { test.send(); }
/// <summary>
/// 启动控制台
/// </summary>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern bool AllocConsole();
/// <summary>
/// 释放控制台
/// </summary>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern bool FreeConsole();
public static void Main()
{ }
}
}
form
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
cmdApp cmdapp = new cmdApp();
private void button1_Click(object sender, System.EventArgs e)
{
cmdApp.AllocConsole();
cmdapp.Connection();
cmdapp.login();
}
private void button2_Click(object sender, System.EventArgs e)
{
cmdapp.send();
}
}
}
你把项目B改成类库项目,项目A直接调用项目B里的方法而不是整个控制台弹出来,就全解决了
public static string InvokeExcute(string Command)
{
Command = Command.Trim().TrimEnd('&') + "&exit";
using (Process p = new Process())
{
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
p.StartInfo.CreateNoWindow = true; //不显示程序窗口
p.Start();//启动程序
//向cmd窗口写入命令
p.StandardInput.WriteLine(Command);
p.StandardInput.AutoFlush = true;
//获取cmd窗口的输出信息
StreamReader reader = p.StandardOutput;//截取输出流
StreamReader error = p.StandardError;//截取错误信息
string str = reader.ReadToEnd() + error.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
return str;
}
}
参考下这段代码,调用Windows自带的cmd,并进行输出。
通过winfrom 控制控制台程序的启动和关闭 不就是调用 exe程序运行吗 。要么就是两者有通信,可以发送信号控制窗体的显示或者关闭