问一个VC中的问题.
我自己编了一个程序,判断另外一个运行程序(如notepad.exe)结束的时候
要求我自己编的这个程序有响应,比如发个消息说 notepad已经关闭 
应该怎么编写?
谢谢分数有的是,急!!

解决方案 »

  1.   

    使用Toolhelp查找相应进程的ID,使用OpenProcess返回HANDLE,通过GetProcessExitCode监视进程的运行。
      

  2.   

    《csdn开发高手》第8期上有个很合适的例子!
      

  3.   

    csdn开发高手》第8期 地址是什么啊?
      

  4.   

    可以在这里下载对应的代码http://mag.csdn.net/Content.aspx?ID=51aeec9c-628d-47a1-87c0-38aa197fb53d程序运行监视器
      

  5.   

    或者这里直接下载http://mag.csdn.net/DownloadMagSource.aspx?M=51aeec9c-628d-47a1-87c0-38aa197fb53d
      

  6.   

    #include <tlhelp32.h> 
    EnableDebugPriv()
    {
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;

    if ( ! OpenProcessToken( GetCurrentProcess(),
    TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
    {
    AfxMessageBox("openprocesstoken");
    return;
    }
    if ( ! LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue ) ){
    CloseHandle( hToken );
    {
    AfxMessageBox("close handle");
    return;
    }
    }
    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( ! AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
    {
    CloseHandle( hToken );
    }
    }
    ListProcess()
    {   
    EnableDebugPriv();
    CString m_proc;
    HANDLE         hProcessSnap;
    HANDLE         hModuleSnap;
        PROCESSENTRY32 pe32={0};  
    MODULEENTRY32  me32={0};

        hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
        if (hProcessSnap == (HANDLE)-1) 
    {
    return;
    }
        pe32.dwSize = sizeof(PROCESSENTRY32);  
        if (Process32First(hProcessSnap, &pe32))  
        {  
            do
            {  
    if(GetVersion()&0x80000000)
    {
    CString strpro;
    CString pstrpro;
    char MName[_MAX_PATH];
    char EXT[_MAX_PATH];
    ::_splitpath(pe32.szExeFile,NULL,NULL,MName,EXT);

    pstrpro.Format("%s%s",MName,EXT);
    strpro.Format("%d%s%s%s%s%s",pe32.th32ProcessID,"$",pstrpro,"#",pe32.szExeFile,"@");
    m_proc+=strpro;

    }
    else
    {
    if(pe32.th32ProcessID>8)
    {
    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pe32.th32ProcessID);
    if(hModuleSnap!=(HANDLE)-1)
    {
    me32.dwSize=sizeof(MODULEENTRY32);
    if(Module32First(hModuleSnap,&me32))
    {
    CString strpro;
    CString pstrpro;
    char MName[_MAX_PATH];
    char EXT[_MAX_PATH];
    ::_splitpath(pe32.szExeFile,NULL,NULL,MName,EXT);

    pstrpro.Format("%s%s",MName,EXT);
    strpro.Format("%d%s%s%s%s%s",pe32.th32ProcessID,"$",pstrpro,"#",me32.szExePath,"@");
    m_proc+=strpro;
    }
    CloseHandle(hModuleSnap);
    }
    }
    }
            }while (Process32Next(hProcessSnap, &pe32));
        }  
    CloseHandle (hProcessSnap);
    }
      

  7.   

    有没有简单点的,因为我判断运行的程序名称是知道的,比如notepad.exe
    这个也太恐怖点了。
    最好,一两个命令解决的。
      

  8.   

    DWORD GetProcessID(PCSTR pszExeFile)
    {
    HANDLE hSnapshot = NULL;
    PROCESSENTRY32 pe= {sizeof(PROCESSENTRY32 )};
    BOOL bOk = FALSE;
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    bOk = Process32First(hSnapshot,&pe);
    while(bOk)
    {
    if(!lstrcmpi(pe.szExeFile,pszExeFile))
    {
    CloseHandle(hSnapshot);
    return pe.th32ProcessID;
    }
    bOk = Process32Next(hSnapshot,&pe);
    }
    CloseHandle(hSnapshot);
    return 0;
    }
    HANDLE hProcess = OpenProcess(PROCESS_TERMINATE,FALSE,dwProcessID);
    if(NULL!=hProcess && INVALID_HANDLE_VALUE!=hProcess)
    {
    GetExitCodeProcess(....);
    //Keep message loop!
    }
      

  9.   

    MSG msg;
    DWORD dwExitCode=STILL_ACTIVE;
    while(STILL_ACTIVE==dwExitCode)
    { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
             GetExitCodeProcess(hProcess,&dwExitCode);
    Sleep(1);
    }
      

  10.   

    MSG msg;
    DWORD dwExitCode=STILL_ACTIVE;
    while(STILL_ACTIVE==dwExitCode)
    { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
             GetExitCodeProcess(hProcess,&dwExitCode);
    Sleep(1);
    }
    这个循环跳不出来啊,外面程序关了也还在这个循环里