如何在VC中达到一定条件时关闭另外一个应用程序,然后再打开它!就象是瑞星升级时的那种效果,升级软件先关闭瑞星杀毒程序,然后升级,最后重新打开.调用另外一个应用程序,实用ShellExcute吗,还有哪些方法?那么关闭呢?谢谢!

解决方案 »

  1.   

    得到那个程序的instance,调用exitinstance()
      

  2.   

    查找存在的程序,发送WM_QUIT(WM_CLOSE)使它关闭。然后用shellexec或者winexec重新打开
      

  3.   

    FindWindow 得到窗口句柄
    发送WM_CLOSE消息
      

  4.   

    CWnd *pWnd = FindWindow(NULL,"程序标题");
    if(pWnd)
       pWnd->PostMessage(WM_QUIT);
      

  5.   

    怎么得到那个程序的instance?是不是非VC的应用程序也可以用通过发送WM_CLOSE消息关闭?比如用Labview编的程序
      

  6.   

    是不是非VC的应用程序也可以用通过发送WM_CLOSE消息关闭?比如用Labview编的程序
      

  7.   

    如果是GUI程序应该都可以,但是对于控制台程序就不行了,只能得到运行程序的hinstance,然后ExitInstance.因为控制台程序无法处理消息,也就收不到WM_CLOSE了
      

  8.   

    WM_CLOSE消息可以跨进程发送么?
    那些消息可以跨进程发送?
      

  9.   

    to  nonowhy:
    好象所有消息都可以吧, 但是一些需要传内存地址做参数的消息会有问题
      

  10.   

    怎么得到某个程序的instance?
      

  11.   

    void CTest1Dlg::OnButtonOPEN() 
    { PROCESS_INFORMATION pi;

    STARTUPINFO si;
    memset(&si,0,sizeof(si));
    si.cb=sizeof(si);
    si.wShowWindow =SW_SHOW;
    si.dwFlags =STARTF_USESHOWWINDOW;
    BOOL fRet=CreateProcess(
    "g:/windows/notepad.exe",
    NULL,                                  //参数前注意有一个空格
    NULL,
    NULL,
    FALSE,
    NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
    NULL,  
    NULL,
    &si,
    &pi);
    if(fRet)
    {
    m_hPro=pi.hProcess ;
    /* unsigned long s1,s2;
    s1=pi.dwProcessId ;
            s2=pi.dwThreadId ;
    CString str;
    str.Format ("%d %d",s1,s2);
    MessageBox(str);
    unsigned long* s;
    s=new(unsigned long);
        *s=s2;
    ResumeThread(s);*/
    }
    else
    MessageBox("打开失败");

    }void CTest1Dlg::OnButtonCLOSE() 
    { if(TerminateProcess(m_hPro,NULL))
    MessageBox("成功关闭");
    else
    MessageBox(“关闭失败");
    }