关于Application.run()的有关问题
关于Application.run()的问题
我现在有一个初始化界面FormA和一个主界面FormB,程序运行时我想先显示初始化界面FormA并调用一个外部"a.exe"程序,然后FormA自动关闭并显示主界面FormB。我尝试的方法类似如下:
Application.Run(new FormA());
System.Diagnostics.Process.Start("E:\\a.exe"); //调用外部程序
Application.Exit();
Application.Run(new FormB());
但是这个方法不行,FormA不会自动关闭,要手动叉掉窗口才会继续后面的语句,该怎么改?
另外c#调用a.exe程序的语句能执行,但是我试了网上说的关闭a.exe的语句却不行,代码如下:
private void btnExit_Click(object sender, EventArgs e) //退出按钮的消息响应函数
{
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process myProcess in myProcesses)
{
if ("a.exe" == myProcess.ProcessName)
myProcess.Kill();
}
Application.Exit();
}
关闭a.exe的代码放在了这个按钮函数里,代码的位置有问题吗?为什么程序退出了而a.exe却没有能关掉?
------解决方案--------------------
Application.Exit();之后,你这个项目生成的exe就退出了,没法再执行后面的FormB。可以把FormA隐藏掉。
------解决方案--------------------
var f = new FormA();
Application.Run(f);
System.Diagnostics.Process.Start("E:\\a.exe"); //调用外部程序
new FormB().Show();
f.Close();
------解决方案--------------------
如果FormA只是一个欢迎界面的作用,建议不要把它作为第一个启动窗口。。。
弄个计时器,多少秒后结束这个欢迎界面。或者真有数据在加载,就等数据加载完把这个欢迎窗口结束掉。
这个时候只有A界面,在FormA里面弄个Timer吧,时间到了调用this.Close(); FormB就出来了,大概就这样了。。。
------解决方案--------------------
比如说,你在Form1进行处理之前想先显示Form2,然后当Form1处理之后再关闭Form2,那么你可以在Form1中定义一个事件通知,例如
然后,进程启动时应该执行
------解决方案--------------------
大致说一下逻辑:
首先,在Process.cs里,你应该这样写:
FormA frm = new FormA();
if(frm.ShowDialog()==DialogResult.OK)
{
Application.Run(new FormB());
}
然后在FormA的Load事件中,创建一个线程,然后在线程中去调用a.exe,当线程调用成功了,把窗口的DialogResult设为OK,并关闭FormA
我现在有一个初始化界面FormA和一个主界面FormB,程序运行时我想先显示初始化界面FormA并调用一个外部"a.exe"程序,然后FormA自动关闭并显示主界面FormB。我尝试的方法类似如下:
Application.Run(new FormA());
System.Diagnostics.Process.Start("E:\\a.exe"); //调用外部程序
Application.Exit();
Application.Run(new FormB());
但是这个方法不行,FormA不会自动关闭,要手动叉掉窗口才会继续后面的语句,该怎么改?
另外c#调用a.exe程序的语句能执行,但是我试了网上说的关闭a.exe的语句却不行,代码如下:
private void btnExit_Click(object sender, EventArgs e) //退出按钮的消息响应函数
{
System.Diagnostics.Process[] myProcesses = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process myProcess in myProcesses)
{
if ("a.exe" == myProcess.ProcessName)
myProcess.Kill();
}
Application.Exit();
}
关闭a.exe的代码放在了这个按钮函数里,代码的位置有问题吗?为什么程序退出了而a.exe却没有能关掉?
------解决方案--------------------
Application.Run(new FormA());
System.Diagnostics.Process.Start("E:\\a.exe"); //调用外部程序
Application.Exit();
Application.Run(new FormB());
Application.Exit();之后,你这个项目生成的exe就退出了,没法再执行后面的FormB。可以把FormA隐藏掉。
------解决方案--------------------
var f = new FormA();
Application.Run(f);
System.Diagnostics.Process.Start("E:\\a.exe"); //调用外部程序
new FormB().Show();
f.Close();
------解决方案--------------------
如果FormA只是一个欢迎界面的作用,建议不要把它作为第一个启动窗口。。。
弄个计时器,多少秒后结束这个欢迎界面。或者真有数据在加载,就等数据加载完把这个欢迎窗口结束掉。
Application.Run(new FormB());
System.Diagnostics.Process.Start("E:\\a.exe"); //调用外部程序
Application.Exit();
private void FormB_Load(object sender, EventArgs e)
{
FormA fA= new FormA();
fA.ShowDialog();
}
这个时候只有A界面,在FormA里面弄个Timer吧,时间到了调用this.Close(); FormB就出来了,大概就这样了。。。
------解决方案--------------------
比如说,你在Form1进行处理之前想先显示Form2,然后当Form1处理之后再关闭Form2,那么你可以在Form1中定义一个事件通知,例如
public event Action OK;然后在Form1的处理(例如在Form_Load中加载数据)完毕之后触发事件通知,例如
private void Form1_Load(object sender, EventArgs e)
{
...............
if (OK != null)
OK();
}
然后,进程启动时应该执行
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var f2 = new Form2();
f2.Show();
....................
var f1 = new Form1();
f1.OK += () => f2.Close();
Application.Run(f1);
}
------解决方案--------------------
大致说一下逻辑:
首先,在Process.cs里,你应该这样写:
FormA frm = new FormA();
if(frm.ShowDialog()==DialogResult.OK)
{
Application.Run(new FormB());
}
然后在FormA的Load事件中,创建一个线程,然后在线程中去调用a.exe,当线程调用成功了,把窗口的DialogResult设为OK,并关闭FormA