用windows API编写一个程序(B程序)去监测另外一个程序(A程序)是否运行,如果它(A程序)没有运行不做任何操作,如果它(A程序)运行,从它(A程序)运行的时候开始计时,等到它(A程序)退出时获得他的运行的时间?A程序是固定不变的一个简单示例程序。
小弟刚学这个windows编程,想了好久没有一点思路,各位大虾帮帮忙啊,最好能有可以运行代码。就当练练手吧哈

解决方案 »

  1.   

    学习就要自己动手做,可以定期使用NtQuerySystemInformation获得进程列表,如果有映像名为a.exe的就用SYNCHRONIZE|PROCESS_QUERY_INFORMATION打开进程并用NtWaitForSingleObject等待,等待有信号后表明进程结束,再用NtQueryInforamtionProcess得到进程运行时间
      

  2.   

    如果用驱动程序就更简单,用PsSetCreateProcessNotifyRoutine设置进程创建、结束通知例程,就可以及时获知进程创建的事件
      

  3.   

     Lactoferrin (列宁): 能说的详细一点吗?本来刚学这个,不大懂啊,谢谢了啊
      

  4.   

    创建进程快照,获取procssname 或者路径,如果得到了程序就在运行… 或者findwindow… 不过正确率应该不高,很容易伪造一个窗口去欺骗
      

  5.   

    可以用CreateProcess创建进程,PROCESS_INFORMATION pi = { 0 };STARTUPINFO si = { 0 };保存进程信息和状态,控制si就可以了
      

  6.   

    GetProcessTimes
    http://www.codeproject.com/KB/threads/getprocesstimes.aspx
      

  7.   

    A中用CreateMutex()B中 OpenMutex()
    GetLastError()==  ERROR_FILE_NOT_FOUND
    WaitForSingleObject
      

  8.   

    进程快照 
    http://download.csdn.net/source/2621894 这个源代码中用到过 可以看下
      

  9.   

    Process and Thread Functions
    中的函数
    OpenProcess 打开程序的句柄
    WaitForSingleObject 等待OpenProcess打开程序句柄的结束上面我给那个例子中有OpenProcess的用法 比如结束程序 修改内存等
      

  10.   

    先添加一个计时器,OnTimer()
    void CXxxxDlg:OnTimer(UINT nIDEvent) 
    {
    HWND hwnd =::FindWindow(NULL,"你要测试的窗口");
    if(hwnd )
    {
    开始计时代码!!
    }
    else
    {
    KillTimer(nIDEvent);
    结束计时的代码,并显示结束时间
    }

    CDialog::OnTimer(nIDEvent);
    }
      

  11.   

    API接口可以getprocesstime,getthreadtime
      

  12.   

    windows核心编程 有进程快照相关api详细介绍和示例源码
      

  13.   

     char *s="进程名字";
     PROCESSENTRY32 pe32;
          memset(&pe32,0,sizeof(pe32));
        pe32.dwSize=sizeof(pe32);
        HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        if(hProcessSnap==INVALID_HANDLE_VALUE)
        {
               printf("create toolhelp32snapshot error\n");
               return -1;
               }
               BOOL bmore= Process32First(hProcessSnap,&pe32);
               while(bmore)
               {
                           if(!strcmp(pe32.szExeFile,s))
                           {
                           i=pe32.th32ProcessID;
                           break;
                           }
                           bmore=Process32Next(hProcessSnap,&pe32);
                           }
                           CloseHandle(hProcessSnap);
    加个 while 加个 sleep
    当然 2楼 的方法最好
      

  14.   

    到msdn上面去查一下就知道了  呵呵
      

  15.   

    BOOL GetProcessID(LPCTSTR lpsz)
    {
    CString strExeName(lpsz);
    strExeName.MakeLower();
    HANDLE handle=::CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
    PROCESSENTRY32 Info ;
    Info.dwSize = sizeof(PROCESSENTRY32);
    if(::Process32First(handle,&Info))

    while(::Process32Next(handle,&Info)!=FALSE)

    CString   ss;
    ss=Info.szExeFile;
    ss.MakeLower();
    if(ss.Compare(strExeName)==0)

    #ifdef WINCE_HD
    CloseToolhelp32Snapshot(handle);
    #else
    CloseHandle(handle);
    #endif
    return Info.th32ProcessID;
    }

    #ifdef WINCE_HD
    CloseToolhelp32Snapshot(handle);
    #else
    CloseHandle(handle);
    #endif
    return FALSE;
    }
    }