当程序A运行异常的时候经常会弹出“内存不可读或写”等之类的对话框,确认后程序退出。作为看门狗程序B:
    1)怎样才能获知程序A已经运行异常?
    2)怎样关掉该对话框,我试过给该对话框发ID_OK消息,但不起作用?
望那位高手帮忙指点一下,不胜感激。

解决方案 »

  1.   

    既然已经运行异常,那么这个进程就会被Windows咔嚓掉,B程序只要检查A程序的进程是否还存在就可以了……关掉对话框只要PostMessage到那个窗口就可以了,PostMessage原型如下
    BOOL PostMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
    );
      

  2.   

    newbiestar() 兄:
         Windows并没有把我运行异常的进程咔嚓掉,而是弹出了个“内存不可读或写”等之类的对话框,必须要人工去确认后进程才会被退出。
        其实我的程序B一直在监测程序A是否还在运行,如果没在运行我就自动将其运行,但程序B并不知道程序A已运行异常。就算我知道多了个“内存不可读或写”等之类的对话框,但我给该对话框发::PostMessage(hWnd, WM_COMMAND, IDOK, 0),却不起作用,我试过对其它窗口发送该消息好使,郁闷。
        还望赐教。
      

  3.   

    1)既然是看门狗程序就要象喂看门狗一样定时由A向B发送消息或事件,如果B到时未收到事件或消息就表明A运行异常了
    2)在程序A类应该加入异常处理,B程序结束A在异常时通常只有TerminateProcess
      

  4.   

    我觉得可这样试一试:
      B中建一定时器.定时查A的弹出框,VC一般的错误框的标题为:
    "mfctest: mfctest.exe - 应用程序错误"形式,你可看一下,把它作为FindWindow的参数
    如以下程序:
      HWND hd=FindWindow(NULL,"mfctest: mfctest.exe - 应用程序错误");
       if (hd==NULL)
        {
           return;
        }
      HWND  hd1=FindWindowEx(hd,NULL,NULL,"确定");
       if (hd1==NULL)
        {
           return;
        }
      int id=::GetDlgCtrlID(hd1);
      ::SendMessage(hd,WM_COMMAND, MAKELONG(id,BN_CLICKED),(long)hd1); //这样就可关闭对话框
      

  5.   

    多谢qrlvls和keiy兄,我现在还是不知道如果已经知道程序异常了,但怎样才能将其关闭。
        arlvls兄说可通过TerminateProcess,但我通过FindWindow可获取程序的主窗口句柄,但怎样通过窗口句柄来获取进程句柄呢?能否给予指点。还有更好的方法吗?
        keiy兄的建议对我很有帮助,特别是用于关闭弹出窗口,多谢。
        我会尽快结账。多谢各位。
      

  6.   

    先用
    DWORD GetWindowThreadProcessId(
      HWND hWnd,             // handle to window
      LPDWORD lpdwProcessId  // address of variable for process identifier
    );
    得到进程的ID,再用
    HANDLE OpenProcess(
      DWORD dwDesiredAccess,  // access flag
      BOOL bInheritHandle,    // handle inheritance flag
      DWORD dwProcessId       // process identifier
    );
    得到进程HANDLE.就可以用TerminateProcess了
      

  7.   

    多谢Everybody,先结账,但希望大家能继续探讨。