在C#里,用Process.start()方法启动一个进程,启动的是一个vb写的exe程序“P2.exe”这个P2.exe就是一个简单的窗体,有一些简单的操作能不能在自己的C#程序里捕获这个P2.exe运行中出现的问题,比如说程序崩溃,或者程序陷入死循环?暂时就把可能出现的问题限定为这两种吧,崩溃或者死循环。如何监测并捕获这种可能出现的问题?先谢谢各位叻

解决方案 »

  1.   

    程序陷入死循环 先别说 你能不能判断其他程序的...  就是连你原项目是否死循环 你都无法判定啊.因为:死循环是一种开发技巧,死循环并非BUG,甚至于不能算糟糕的编码.如果VB程序崩溃,你要判断这个的话还是有得实现.就是定时检查你启动的这个进程 有没有消失.
      

  2.   

    "程序崩溃,或者程序陷入死循环"
    1.程序崩溃
    异常处理或者忽略错误 on error resume next
    2.程序陷入死循环
    该打屁股,这类问题,请修改代码解决。不要头痛医脚。
      

  3.   


    直接的方法没有,可以试试通过第三方软件运行过程中的一些状态推断程序崩溃,或陷入死循环。需要取得相关信息:程序崩溃时会出现的现象,如弹出的出错窗口。                  陷入死循环时,超过多长时间,窗面信息不变,预期的界面上的信息变化(WM_GETTEXT)。方法主要是 WINAPI .[DllImport("user32.dll", EntryPoint = "FindWindow")]
    private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll")]
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    [DllImport("user32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);[DllImport("User32.dll", EntryPoint = "SendMessage")]
    private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam);const int WM_GETTEXT = 0x000D;
    const int WM_SETTEXT = 0x000C;
    const int WM_CLICK = 0x00F5;
      

  4.   

    应该是可以的。我记得以前有个API可以捕捉进程的退出代码。
      

  5.   


    哦,那现在我的思路是:
    因为本来有这个vb程序窗体的句柄(叫hWnd吧),通过判断这个窗体是否存在来判断程序是否已经退出,如何根据这个hWnd来判断他所指向的窗体还是否存在呢??
      

  6.   

    可以在定时器中FindWindow寻找你想找的窗体,如果句柄(叫hWnd吧)不为0就表示窗体还存在,如果为0就表示不存在了.也可以使用Process类,多利用Process类中的一些属性
                ProcessStartInfo pi = new ProcessStartInfo();
                pi.FileName = "cmd.exe";
                Process pc = Process.Start(pi);
                // 获取指示关联进程是否已终止的值。
                bool exited = pc.HasExited;
                // 获取指示进程的用户界面当前是否响应的值。
                bool Responding = pc.Responding;