日期:2014-05-18  浏览次数:20919 次

关于Process打开外部程序遇到的问题,在线急等,解决就给分!
我在程序的加载项frm_Load下写了下面这段代码,实现在加载程序的同时打开指定外部应用程序Kk.exe

  //声明一个程序信息类 
  ProcessStartInfo Info = new ProcessStartInfo();
   
  //设置外部程序名 
  Info.FileName = "Kk.exe";

  //设置外部程序工作目录
  Info.WorkingDirectory = Application.StartupPath;

  //声明一个程序类 
  Process Proc;

  try
  {
  // 
  //启动外部程序 
  // 
  Proc = Process.Start(Info);

  //等待3秒钟 
  Proc.WaitForExit(3000);

  }

kk.exe打开了,它弹出一个对话框(这个对话框不重要),我的程序好像就没加载了,关闭这个对话框后,程序的界面又显现出来。

怎么可以实现,打开kk.exe后,它的弹出对话框不影响我的程序运行??

------解决方案--------------------
那你就不要在load中加载程序就是了。
------解决方案--------------------
你单步调试下,看程序在Proc = Process.Start(Info); 是否继续执行
------解决方案--------------------
你自己中断了程序执行,在等待呢,你的界面当然是白的。
Proc.WaitForExit(3000);

Process.WaitForExit 方法:
设置等待关联进程退出的时间,并在该段时间结束前或该进程退出前,阻止当前线程执行。 

 重载列表 
Process.WaitForExit () 指示 Process 组件无限期地等待关联进程退出。 由 .NET Compact Framework 支持。 
 
Process.WaitForExit (Int32) 指示 Process 组件在指定的毫秒数内等待关联进程退出。 由 .NET Compact Framework 支持。 

------解决方案--------------------
哦,就是VB6经常用到的Shell(),不好意思。

命名空间: Microsoft.VisualBasic 
模块: Interaction 
程序集: Visual Basic Runtime Library(在 Microsoft.VisualBasic.dll 中)

你打开你的MSDN,索引[Shell 函数],就有你的答案了。

------解决方案--------------------
To Q69524898 
我进一步对程序进行了测试,上面的代码没有问题,问题应该是这样:

我用SendMessage(EdithWnd, WM_CLICK, (IntPtr)0, "0");点击了一个外部程序的确定按钮,外部程序弹出一个对话框,我的程序就没有反应了(界面上的任何控件都不能使用),必须关闭弹出的这个对话框,程序才能继续!

这个是怎么回事呢??我的程序怎样才不受这个弹出对话框的影响?


SendMessage 是同步发送消息,会等待消息返回,如果消息不返回就一直不响应。

LZ可以试试换成PostMessage(这个发消息,不管返回,同时的优先级发送消息),或者使用SendMessageTimeout(依然是同步发送,但是只等待指定超时时间),然后把TimeOut设置很小就可以了。